objective c singleton dispatch_once implementation is better?
我见过很多人建议使用分派来完成单件任务:
1 2 3 4 5 6 7 8 9 | +(MyClass *)singleton { static dispatch_once_t pred; static MyClass *shared = nil; dispatch_once(&pred, ^{ shared = [[MyClass alloc] init]; }); return shared; } |
为什么当它不真正支持真正的singleton,并且人们仍然可以使用init来创建实例,甚至在sharedInstance上进行发布时,情况会更好呢?
苹果的方法是阻止所有这些案件http://developer.apple.com/library/mac/documentation/cocoa/conceptive/cocoafundamentals/cocoaObjects/cocoaObjects.html我知道它不是线程安全的,但我认为在那里放置一个同步块很容易使它线程安全。
为什么不把两者结合起来呢?
使用您列出的函数而不是Apple的
这里有更多的讨论:我的目标C单例应该是什么样的?
如果您希望它是单例的,并且您担心如果您调用alloc/init会发生什么:不要这样做!很简单。
有些情况下,如nsfilemanager,其中既有一个单实例[nsfilemanager defaultmanager],也可以有单独的nsfilemanager*对象。所以这很容易做到。