关于ios:objective c singleton dispatch_once实现更好?

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的+ (MyGizmoClass*)sharedManager函数,但实现所有allocWithZonecopyWithZoneretainretainCountreleaseautorelease重写。

这里有更多的讨论:我的目标C单例应该是什么样的?


如果您希望它是单例的,并且您担心如果您调用alloc/init会发生什么:不要这样做!很简单。

有些情况下,如nsfilemanager,其中既有一个单实例[nsfilemanager defaultmanager],也可以有单独的nsfilemanager*对象。所以这很容易做到。