ios-单例模式饿汉式&GCD&懒汉式&宏方式的实现和条件编译
2017-08-22 20:34
507 查看
饿汉式其实就是当程序一启动就是创建单例,在ios中不推荐去使用
我们在写项目的时候如果想要指定在ARC下执行什么代码,在MRC下执行什么代码,我们可以用条件编译来写
#if __has_feature(objc_arc)
//编译环境是ARC
NSLog(@"kkk");
#else
//编译环境是MRC
NSLog(@"kkk");
#endif
static id instance; + (void)load //装载内存时就实例化,仅此一次 { _instance = [[self alloc] init]; } + (id)allocWithZone:(struct _NSZone *)zone { //这里可以不用加锁,因为是在load里面创建的 if (_instance == nil) { // 防止创建多次 _instance = [super allocWithZone:zone]; } return _instance; } + (instancetype)sharedManagerTool { return _instance; } - (id)copyWithZone:(NSZone *)zone { return _instance; }GCD的单例实现方式
static id _instace; + (id)allocWithZone:(struct _NSZone *)zone { static dispatch_once_t onceToken; //这个函数是线程安全的 dispatch_once(&onceToken, ^{ _instace = [super allocWithZone:zone]; }); return _instace; } + (instancetype)sharedDataTool { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instace = [[self alloc] init]; }); return _instace; } - (id)copyWithZone:(NSZone *)zone { return _instace; }懒汉式的实现就是在用到的时候再去创建
static id _instance; //alloc内部会调用这个代码 + (id)allocWithZone:(struct _NSZone *)zone { if (_instance == nil) { // 防止频繁加锁 @synchronized(self) { if (_instance == nil) { // 防止创建多次 _instance = [super allocWithZone:zone]; } } } return _instance; } + (instancetype)sharedMusicTool { if (_instance == nil) { // 防止频繁加锁 @synchronized(self) { if (_instance == nil) { // 防止创建多次 _instance = [[self alloc] init]; } } } return _instance; } - (id)copyWithZone:(NSZone *)zone { return _instance; }非ARC下的单例模式
static id _instace; + (id)allocWithZone:(struct _NSZone *)zone { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instace = [super allocWithZone:zone]; }); return _instace; } + (instancetype)sharedDataTool { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instace = [[self alloc] init]; }); return _instace; } - (id)copyWithZone:(NSZone *)zone { return _instace; } //为了保证对象不被释放,所以在release中不做任何操作 -(oneway void)release { } //retain的时候返回自己 - (id)retain { return self; } - (NSUInteger)retainCount { return 1; } //这里其实加不加都一样,因为最后会调用release操作,而我们又重写了release方法 - (id)autorelease { return self; }因为我们如果每用到一个类就要去复制这些代码,所以我们可以把这些代码定义成宏,确定就是不好调试。\这个的意思就是后面的一行都是它的.我们想用的话想把sharedInstance的Instance的名字改成我们自己传的名字,下面加()和传入参数name
// .h文件 #define SingletonH(name) + (instancetype)shared##name; // .m文件 #define SingletonM(name) \ static id _instance; \ \ + (id)allocWithZone:(struct _NSZone *)zone \ { \ static dispatch_once_t onceToken; \ dispatch_once(&onceToken, ^{ \ _instance = [super allocWithZone:zone]; \ }); \ return _instance; \ } \ \ + (instancetype)shared##name \ { \ static dispatch_once_t onceToken; \ dispatch_once(&onceToken, ^{ \ _instance = [[self alloc] init]; \ }); \ return _instance; \ } \ \ - (id)copyWithZone:(NSZone *)zone \ { \ return _instance; \ }
我们在写项目的时候如果想要指定在ARC下执行什么代码,在MRC下执行什么代码,我们可以用条件编译来写
#if __has_feature(objc_arc)
//编译环境是ARC
NSLog(@"kkk");
#else
//编译环境是MRC
NSLog(@"kkk");
#endif
相关文章推荐
- iOS-单例模式(懒汉式和饿汉式)和GCD实现
- 单例模式的两种实现方式:懒汉式 饿汉式
- 浅析iOS中单例模式的写法(懒汉式&饿汉式&ARC&非ARC&宏)
- ios开发单例模式——使用GCD实现单例模式 & 非ARC单例模式 &使用GCD和线程锁实现单例模式
- iOS- 网络访问两种常用方式【GET & POST】实现的几个主要步骤
- iOS下单例模式实现(一)(objective-c arc gcd)
- iOS KVO 观察者模式实现方式
- 2015.4.25.14.03_Singleton_2015.4.25_ 单例模式的七种写法&懒汉式&饿汉式
- 单例模式中懒汉式和饿汉式 实现和总结
- java单例设计模式 饿汉式 懒汉式
- 多线程安全问题在单例模式中的体现(懒汉式&饿汉式)
- 单例模式(饿汉式&懒汉式)
- iOS GCD 和信号量 实现 生产者和消费者模式
- 用条件编译实现,输入一行字符,可以用两种方式输出,一种为原文输出;另一种将字母转变成后继字母,即按密码输出
- 单例模式的三种实现 HungrySingleton(饿汉式) LazySingleton1(懒汉式:方法级锁) LazySingleton2(懒汉式:双检查锁 有BUG)
- 懒汉式 && 饿汉式 的单例模式
- 创建单例的两种方式(懒汉式&GCD)
- 单例模式的简单实现与两种实现方法的比较(饿汉式和懒汉式)(一)
- 设计模式-单例模式(饿汉式及懒汉式的Java实现)
- 单例模式的简单实现与两种实现方法的比较(饿汉式和懒汉式)(二)