objective c singleton dispatch_once实现更好?

时间:2012-01-05 18:33:24

标签: objective-c ios singleton

我见过很多人建议使用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 个答案:

答案 0 :(得分:2)

为什么不把两者结合起来呢?

使用您列出的功能代替Apple的+ (MyGizmoClass*)sharedManager功能,但实现所有allocWithZonecopyWithZoneretainretainCount,{{1 }}和release覆盖。

此处有更多讨论:What should my Objective-C singleton look like?

答案 1 :(得分:-1)

如果你想让它成为一个单身人士,你担心如果你调用alloc / init会发生什么:不要这样做!就那么简单。

个案例,如NSFileManager,你有两个单独的[NSFileManager defaultManager],但你也可以拥有单独的NSFileManager *对象。所以这很容易实现。