我见过很多人建议使用dispatch_once来做单例:
+(MyClass *)singleton {
static dispatch_once_t pred;
static MyClass *shared = nil;
dispatch_once(&pred, ^{
shared = [[MyClass alloc] init];
});
return shared;
}
当它真的不支持真正的单例时,为什么这会更好?人们仍然可以使用init来创建实例甚至在sharedInstance上发布一个版本?
Apple的方法是阻止所有这些情况http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html我知道它不是线程安全的,但我认为很容易在其中放置一个同步块以使其成为线程安全的 .
2 回答
为什么不把两者结合起来呢?
使用您列出的函数而不是Apple的
+ (MyGizmoClass*)sharedManager
函数,但实现所有allocWithZone
,copyWithZone
,retain
,retainCount
,release
和autorelease
覆盖 .这里有更多的讨论:What should my Objective-C singleton look like?
如果你想让它成为一个单身,你担心如果你调用alloc / init会发生什么:不要这样做!就那么简单 .
有些情况,比如NSFileManager,你有两个单独的[NSFileManager defaultManager],但你也可以拥有单独的NSFileManager *对象 . 所以这很容易实现 .