- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
您可以通过多种方式创建单例。我想知道这两者之间哪个更好。
+(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;
}
两者之间有什么主要区别吗?我知道这些可能足够相似,不必担心。但只是想知道。
最佳答案
主要区别在于第一个使用 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的,如果你想要非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
(完全按照第一个链接的解释)
关于单例的最后一个很好的解释:
关于objective-c - 单例创建首选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10859750/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!