Objective c 目标c单例调度_一次实现是否更好?

Objective c 目标c单例调度_一次实现是否更好?,objective-c,ios,singleton,Objective C,Ios,Singleton,我见过很多人建议用dispatch_做一次单件: +(MyClass *)singleton { static dispatch_once_t pred; static MyClass *shared = nil; dispatch_once(&pred, ^{ shared = [[MyClass alloc] init]; }); return shared; } 当它不支持真正的单例,人们仍然可以使用init创建实例,甚

我见过很多人建议用dispatch_做一次单件:

+(MyClass *)singleton {
    static dispatch_once_t pred;
    static MyClass *shared = nil;

    dispatch_once(&pred, ^{
        shared = [[MyClass alloc] init];
    });
     return shared;
}
当它不支持真正的单例,人们仍然可以使用init创建实例,甚至在sharedInstance上发布时,为什么这样更好

苹果的做法是防止所有这些案例
我知道它不是线程安全的,但我认为在那里放置一个同步块以使其线程安全是很容易的。

为什么不将两者结合起来呢

使用您列出的函数,而不是Apple的
+(MyGizmoClass*)sharedManager
函数,但要实现所有
allocWithZone
copyWithZone
retain
retainCount
release
自动删除
覆盖


这里有更多的讨论:

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


有些情况下,如NSFileManager,您既有一个单例[NSFileManager defaultManager],也可以有单个NSFileManager*对象。所以这很容易实现

这是快速的,并保证您将始终得到相同的对象,无论您如何调用它。大多数编写单例的人也是使用单例的人,因此他们(或他们的团队)知道不要尝试分配新实例。如果你想让你的类可测试,你仍然可以
alloc
/
init
it。使用Apple的singleton模式,您必须处理在测试之间设置/删除对象状态的问题。我认为将一些库/框架分发给其他库/框架以供使用是很常见的,这些库/框架将使用singleton。是的,大多数开发人员应该理解sharedInstance的含义,并且不按照惯例对其进行任何内存管理。然而,你仍然没有办法真正阻止它,对吗?为什么不呢?因为它会与圆弧相冲突。