<网搜>单例模式:创建单例对象的两种方式


方式一:iOS4版本之前

  static SingleClassManager *singleManager = nil;
     +(SingleClassManager*)sharedManager
     {
             @synchronized(self)  //同步加锁,在多线程中使用,可以使线程安全
             {             
                   if(singleManager == nil)
                    {
                              singleManager = [[SingleClassManager alloc]init];
                    } 
              }
           return singleManager;
      }

 

方式二:iOS5版本开始(block函数)

   

+ (DSLocationManager *)shareInstance{

    static DSLocationManager *manager = nil;
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [[DSLocationManager alloc]init];
    });
    
    return manager;
}

    该方法有很多优势: 

           1 线程安全

           2 很好满足静态分析器要求

           3 和自动引用计数(ARC)兼容 

           4 仅需要少量代码

     说明:

            该函数接收一个dispatch_once用于检查该代码块是否已经被调度的谓词(是一个长整型,实际上作为BOOL使用)。它还接收一个希望在应用的生命周期内仅被调度一次的代码块,对于本例就用于shared实例的实例化。

dispatch_once不仅意味着代码仅会被运行一次,而且还是线程安全的,这就意味着你不需要使用诸如@synchronized 之类的来防止使用多个线程或者队列时不同步的问题。


你可能感兴趣的:(<网搜>单例模式:创建单例对象的两种方式)