单例

如果可能,请尽量避免使用单例而是依赖注入。 然而,如果一定要用,请使用一个线程安全的模式来创建共享的实例。对于 GCD,用 dispatch_once() 函数就可以咯。

+ (instancetype)sharedInstance
{
   static id sharedInstance = nil;
   static dispatch_once_t onceToken = 0;
   dispatch_once(&onceToken, ^{
      sharedInstance = [[self alloc] init];
   });
   return sharedInstance;
}

使用 dispatch_once(),来控制代码同步,取代了原来的约定俗成的用法。

+ (instancetype)sharedInstance
{
    static id sharedInstance;
    @synchronized(self) {
        if (sharedInstance == nil) {
            sharedInstance = [[MyClass alloc] init];
        }
    }
    return sharedInstance;
}

dispatch_once() 的优点是,它更快,而且语法上更干净,因为dispatch_once()的意思就是 “把一些东西执行一次”,就像我们做的一样。 这样同时可以避免 possible and sometimes prolific crashes.

经典的单例对象是:一个设备的GPS以及它的加速度传感器(也称动作感应器)。 虽然单例对象可以子类化,但这种方式能够有用的情况非常少见。 必须有证据表明,给定类的接口趋向于作为单例来使用。 所以,单例通常公开一个sharedInstance的类方法就已经足够了,没有任何的可写属性需要被暴露出来。

尝试着把单例作为一个对象的容器,在代码或者应用层面上共享,是一个糟糕和丑陋的设计。

NOTE:单例模式应该运用于类及类的接口趋向于作为单例来使用的情况 (译者注)

你可能感兴趣的:(单例)