单例的几种创建方式
来源:互联网 发布:南京网络电视台 回放 编辑:程序博客网 时间:2024/06/16 03:46
假设单例类名为XYXManager;
<在ARC下>
一、GCD
.h文件中
+(instancetype)shareInstance;
.m文件中
+ (XYXManager *)defaultManager { static XYXManager *defaultInstance = nil; static dispatch_once_t predicate; dispatch_once(&predicate, ^{ defaultInstance = [[self alloc] init]; }); return defaultInstance; }
优点:
1.这个方法可以在创建单例或者某些初始化动作时使用,以保证其唯一性。2.该方法是线程安全的,所以请放心大胆的在子线程中使用。(前提是你的dispatch_once_t *predicate对象必须是全局或者静态对象。这一点很重要,如果不能保证这一点,也就不能保证该方法只会被执行一次。)
二、@synchronized
.h文件中
+(instancetype)shareInstance;
.m文件中
+ (XYXManager *)defaultManager { static XYXManager *defaultInstance = nil; @synchronized (self){ if (!defaultInstance){ defaultInstance = [[super allocWithZone:NULL]init]; } } return bluetoothInstance; }
@synchronized,代表这个方法加锁, 相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程例如B正在用这个方法,有的话要等正在使用synchronized方法的线程B运行完这个方法后再运行此线程A,没有的话,直接运行。
优点:比GCD方法简明,同样是线程安全的,初始化alloc、init也都止执行一次。
需要注意的是,无论用方法一还是方法二,都应该实现以下父方法
+(instancetype)allocWithZone:(struct _NSZone *)zone{
return [self shareInstance];
}-(id)copy{
return self;
}
很神奇的一个小技巧
如果不想在.m文件中写copy 和 allocWithZone方法,则可以在.h中设置禁止他人调用这两个方法:
+(instancetype)alloc NS_UNAVAILABLE;+(instancetype)allocWithZone:(struct _NSZone *)zone NS_UNAVAILABLE;-(id)copy NS_UNAVAILABLE;
另外一个很神奇的小技巧
如果数据需要初始化,可以放在_init中
.h中禁用-(instancetype)init NS_UNAVAILABLE;
.m中@interface XYXManager()-(instancetype)_init;@end+(instancetype)shareInstance{ static EPLBluetooth *bluetoothInstance = nil; @synchronized (self){ if (bluetoothInstance == nil){ bluetoothInstance = [[super allocWithZone:NULL]_init]; } } return bluetoothInstance;}-(instancetype)_init{ if (self = [super init]) { //do the init things } return self;}
同样,若不想让外部调用init方法,也使用NS_UNAVAILABLE在h文件中设定
<在MRC下>
自觉添加上 release、retain、autorelease、retainCount方法
- (id) retain{ return [XYXManager shareInstance];}- (oneway void) release{}- (instancetype) autorelease{ return self;}- (unsigned) retainCount{ return UINT_MAX;}
0 0
- 单例的几种创建方式
- 创建单例的几种方式
- 创建单例模式的几种方式
- 创建单例模式(Singleton)的几种方式
- 浅谈单例模式的几种创建方式
- 单例实现的几种方式
- 单例的几种实现方式
- 实现单例的几种方式
- 单例的几种实现方式
- 五种创建单例的方式
- 创建单例的两种方式
- 单例的两种创建方式
- 单例的两种创建方式
- 单例创建的2种方式
- 单例的创建方式
- 创建单例的方式
- 单例创建的方式
- 几种常见的单例的设计方式
- 素数判断算法(高效率)
- 2——3树
- [ISUX译]iOS 9人机界面指南(三):iOS 技术
- 【个人日记】
- mysql5.7多源复制
- 单例的几种创建方式
- 记circle_of_life
- 说说域名
- FlashDevelop还是太弱了。
- 大三成长日记——第二弹(批处理bat篇)
- 请教一个EasyTouch的问题,如何实现摇杆和之外的触模区域独立
- 279. Perfect Squares-Leetcode(关于DP的再深入研究)
- hdu 2639 Bone Collector II(01背包)(第k优解)
- Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 Web modules (web项目不能加载到服务器))