如何避免通过[[alloc] init]创建iOS单例类?
网站普遍的创建单例类的方法有下面两种:
+ (instancetype)sharedManager { static id _sharedInstance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _sharedInstance = [[self alloc] init]; }); return _sharedInstance; }
+ (instancetype)sharedManager { static id _sharedInstance = nil; @synchronized(self) { if (_sharedInstance == nil) _sharedInstance = [[self alloc] init]; } ret优艾设计网_设计urn _sharedInstance; }
但是该如何避免意外的用[[alloc] init]
创建呢?主要是发现网上找到的大多仅仅只有上面的代码,少有考虑被init
或者copy
的情况
花霸王 优艾设计网_PS论坛 3小时前
这样写就可以了
天若有情Simon 3小时前 优艾设计网_Photoshop百科
额外创建有很多,还有new方法也可以,把这些方面都重载一遍返回 sharedManager 实例,或者直接抛出异常
2016幸运星 3小时前 优艾设计网_Photoshop交流
又去stackovweflow找了下方法,我觉得既然是单例模式,调用者就应该严格按照单例的要求,通过统一的接口(这里是sharedInstance)去创建单例,而不应该出现调用[[class alloc] init]也能成功创建单例的情况,如果出现[[class alloc] init]的情况,我觉得更应该让Xcode给出警告不能用此方法
xwxwbetter 3小时前
覆盖allocWithZone和copyWithZone方法。因为通过alloc或者copy还是new,都是通过调用allocWithzone和copyWithzone来分配空间的。优艾设计网_设计百科你可以把sharedManager 方法里面的代码写到这两个方法里面,就可以从根本实现了单例的情况
soma218 3小时前
(instancetype)init {@throw [NSException exceptionWithName:@"Disable" reason:@"Please use init instead..." userInfo:优艾设计网_在线设计nil];return self;}
Along.天神 优艾设计网_设计LOGO 3小时前
http://www.jianshu.com/p/08b1... 看看这篇我的写博客.
精彩评论