首页 文章

objective c singleton dispatch_once实现更好?

提问于
浏览
2

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

  • 2

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

    使用您列出的函数而不是Apple的 + (MyGizmoClass*)sharedManager 函数,但实现所有 allocWithZonecopyWithZoneretainretainCountreleaseautorelease 覆盖 .

    这里有更多的讨论:What should my Objective-C singleton look like?

  • -1

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

    有些情况,比如NSFileManager,你有两个单独的[NSFileManager defaultManager],但你也可以拥有单独的NSFileManager *对象 . 所以这很容易实现 .

相关问题