oc84--单利
// Tools.h #import <Foundation/Foundation.h> @interface Tools : NSObject<NSCopying, NSMutableCopying>
// 一般情况下创建一个单例对象都有一个与之对应的类方法,一般情况下用于创建单例对象的方法名称都以share开头, 或者以default开头
+ (instancetype)shareInstance; @end
//
// Tools.m #import "Tools.h" @implementation Tools + (instancetype)shareInstance
{
Tools *instance = [[self alloc] init];//调用allocWithZone
return instance;
} static Tools *_instance = nil;
+ (instancetype)allocWithZone:(struct _NSZone *)zone //alloc内部会调用allocWithZone
{
// 由于所有的创建方法都会调用该方法, 所以只需要在该方法中控制当前对象只创建一次即可 /*
// 当前代码在多线程中可能会出现问题
NSLog(@"%s", __func__);
if (_instance == nil) {
NSLog(@"创建了一个对象");
_instance = [[super allocWithZone:zone] init]; //去父类创建,不能用self否则会死循环,
}
return _instance;
*/ // 以下代码在多线程中也能保证只执行一次
static dispatch_once_t onceToken;//long类型
dispatch_once(&onceToken, ^{
_instance = [[super allocWithZone:zone] init];
});
return _instance;
} // copyWithZone方法用什么调用? 对象,对象已经有了,就用原来的对象。
- (id)copyWithZone:(NSZone *)zone{
// Tools *t = [[[self class] allocWithZone:zone] init]; //调用allocWithZone,所以这里也是单利,
// return t;
return _instance;
} - (id)mutableCopyWithZone:(NSZone *)zone
{
// Tools *t = [[[self class] allocWithZone:zone] init];
// return t; return _instance;
} //MRC:MRC才可以写release,retain,retainCount
- (oneway void)release
{
// 为保证整个程序过程中只有一份实例, 在这个方法中什么都不做,单利释放了就没有了。
} - (instancetype)retain
{
return _instance;
} - (NSUInteger)retainCount
{
// return 1;
// 注意: 为了方便程序员之前沟通, 一般情况下不会在单例中返回retainCount = 1
// 而是返回一个比较大得值
return MAXFLOAT;
} @end
//
// main.m
// 单例:只有一个实例,只有程序挂掉实例才释放。
// #import <Foundation/Foundation.h>
#import "Tools.h" int main(int argc, const char * argv[]) { //ARC
// 单例就是无论怎么创建都只能有一个实例对象
// 如果地址相同就代表着是同一个实例对象
Tools *t11 = [[Tools alloc] init]; //alloc内部会调用allocWithZone,这里调用allocWithZone,
Tools *t21 = [Tools new];// [[alloc] init], allocWithZone,,这里调用allocWithZone,
Tools *t31 = [Tools shareInstance];//先调用shareInstance再调用allocWithZone, Tools *t41 = [t31 copy];
Tools *t51 = [t31 mutableCopy]; NSLog(@"%p, %p, %p, %p, %p", t11, t21, t31, t41, t51);//0x1005035e0, 0x1005035e0, 0x1005035e0, 0x1005035e0, 0x1005035e0 //MRC
Tools *t2 = [[Tools alloc] init];
[t2 retain];
[t2 retain];
[t2 retain];
[t2 retain];
[t2 retain];
NSLog(@"retainCount = %lu", [t2 retainCount]);//
NSLog(@"t2 = %p", t2);//t2 = 0x1005035e0
[t2 release]; Tools *t1 = [Tools shareInstance];
NSLog(@"retainCount = %lu", [t1 retainCount]);//
NSLog(@"t1 = %p", t1);//0x1005035e0
[t1 release]; return ;
}
oc84--单利的更多相关文章
- java 开发中经常问到得懒汉模式 (单利模式)
//懒汉模式 class Single { public static Single s = null; public Single (){} public static Single getInst ...
- Javase部分回顾(static (静态修饰符),修饰方法,单利的设计模式, 封装)
static (静态修饰符) 1.修饰成员变量 静态变量的访问方式: 方式一 : 通过对象访问. 对象.变量名 ...
- java 单利模式
首先何为单利模式: 单利模式即多次调用同一个对象的时候,只有一个实例(这里所谓的实例就是,假如创建了两个对象,它们的hashCode相同) 下面是相关代码: 1 创建一个对象Singleton类 pa ...
- static单利模式
// // main.m // 01-文件管理器 // // Created by apple on 14-3-21. // Copyright (c) 2014年 apple. All ri ...
- 单利 复利计算器程序1.0 2.0 3.0 [ 合 ] 之 C语言
本程序用C语言编写~~~ 1.计算:本金为100万,利率或者投资回报率为3%,投资年限为30年,那么,30年后所获得的利息收入:按复利计算公式来计算就是:1,000,000×(1+3%)^30 1 v ...
- java 设计模式之单利模式以及代理模式(静态)
1:单利模式: public class Singleton { private static Singleton uniqueInstance = null; private Singleton() ...
- PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结
前 言 OOP 学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1 PHP中的抽象 ...
- iOS 单利模式实现/优缺点
感谢此文章提供摘要: http://www.cnblogs.com/lyanet/archive/2013/01/11/2856468.html 优缺点:http://blog.csdn.net/ta ...
- Node.js之单利模式
在iOS中我们经常用到单利模式,这样就能够实现在多处共享同一数据,那么在Node.js中也存在这种模式. 我们知道,Node.js中模块的概念很重要,在写模块的接口的时候,只需要暴露出一个实例对象就能 ...
- 设计模式学习心得<单利模式 Singleton>
概述 意图 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 主要解决 一个全局使用的类频繁地创建与销毁. 何时使用 当您想控制实例数目,节省系统资源的时候. 如何解决 判断系统是否已经有这个单 ...
随机推荐
- MFC_2.4 组合框和图片控件
组合框和图片控件 1.拖控件 图片属性更改Type 为Bitmap 名字也要改,不能为IDC_STATIC 绑定变量控件,重命名. 2.初始化 // 设置一个定时器,用于更新图片 SetTimer(0 ...
- 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
package algorithms; /* 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. public class ListNode { int val; ListNo ...
- Linux(Centos7) 设置静态IP
关于虚拟机 这里使用Centos7为例,因为linux是安装在在虚拟机中,这里先看一下虚拟机的网络适配器: 这里我使用的NAT模式,接着配置虚拟机的虚拟网络: 这里主要看一下VMnet8的设置: 这里 ...
- CMU-准备
TOEFL成绩90分以上,GPA大于3.0,GRE1250分以上(不做明确要求) 申请条件:GRE成绩,建议有专科成绩;托福250,雅思7.0;简历;3封推荐信 TOEFL(The Test of E ...
- 服务器 获取用户 真实ip
在有代理的情况下,因为要代替客户端去访问服务器,所以,当请求包经过反向代理后,在代理服务器这里这个IP数据包的IP包头做了修改,最终后端WEB服务器得到的数据包的头部源IP地址是代理服务器的IP地址. ...
- vue-router + axios token登录状态认证
vue项目中登录状态判断往往基于jwt认证,我们可以采用判断本地是否存在token,及token是否过期或token值错误 1.利用vue-router 钩子函数判断本地是否存在token impor ...
- BLOCK层基本概念:bio,request,request_queue
Summary bio 代表一个IO 请求 request 是bio 提交给IO调度器产生的数据,一个request 中放着顺序排列的bio 当设备提交bio 给IO调度器时,IO调度器可能会插入bi ...
- valgrind检查代码内存泄漏,5种内存泄漏情况
摘要: valgrind是linux下用于调试程序和查找内存泄露的常用工具.valgrind会报告5种内存泄露,"definitely lost", "indirectl ...
- <MyBatis>入门一 HelloWorld
1.HelloWorld 导入依赖 <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependen ...
- MySQL6
MySQL数据库6 1. 集群概述 性能达到瓶颈的解决方案 Scale Up 向上扩展能力,如增加更好的硬件固态磁盘,加大内存等,成本高,效果不显著 Scale Out 向外扩展,例如建立更多的服务器 ...