iOS ---单例

请尽量避免使用单例而是依赖注入。占内存, 而且全局的东西状态不易改变, 不够灵活. 然而,如果一定要用,请使用一个线程安全的模式来创建共享的实例。

对于 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:单例模式应该运用于类及类的接口趋向于作为单例来使用的情况 (译者注)

文/CSNA(作者)原文链接:http://www.jianshu.com/p/7e1e6d8b9dcf著作权归作者所有,转载请联系作者获得授权,并标注“作者”。

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