您可以通过各种方式创建单身人士。我想知道这些之间哪个更好。
+(ServerConnection*)shared{
static dispatch_once_t pred=0;
__strong static id _sharedObject = nil;
dispatch_once(&pred, ^{
_sharedObject = [[self alloc] init]; // or some other init method
});
return _sharedObject;
}
我可以看到这可以很快地编译成一些东西。我认为检查谓词将是另一个函数调用。 另一个是:
+(ServerConnection*)shared{
static ServerConnection* connection=nil;
if (connection==nil) {
connection=[[ServerConnection alloc] init];
}
return connection;
}
两者之间有什么重大差异吗?我知道这些可能相似,不用担心。但只是想知道。
答案 0 :(得分:2)
主要区别在于第一个使用Grand Central Dispatch来确保创建单例的代码只运行一次。这可以向您保证它将是一个单身人士。
此外,GCD应用威胁安全性,因为根据规范,每次调用dispatch_once都将同步执行。
我会推荐这个
+ (ConnectionManagerSingleton*)sharedInstance {
static ConnectionManagerSingleton *_sharedInstance;
if(!_sharedInstance) {
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
_sharedInstance = [[super allocWithZone:nil] init];
});
}
return _sharedInstance;
}
+ (id)allocWithZone:(NSZone *)zone {
return [self sharedInstance];
}
- (id)copyWithZone:(NSZone *)zone {
return self;
}
从这里采取http://blog.mugunthkumar.com/coding/objective-c-singleton-template-for-xcode-4/
修改强>
以下是您要问的答案 http://cocoasamurai.blogspot.jp/2011/04/singletons-your-doing-them-wrong.html
编辑2:
如果您想要非弧支持添加
,以前的代码适用于ARC#if (!__has_feature(objc_arc))
- (id)retain {
return self;
}
- (unsigned)retainCount {
return UINT_MAX; //denotes an object that cannot be released
}
- (void)release {
//do nothing
}
- (id)autorelease {
return self;
}
#endif
(正如第一个链接所解释的那样)
最后一个关于单身人士的非常好的解释: