单例-------OC中单例 / Swift中单例


单例 :通常应用在 网络工具、音频工具安全


OC中单例写法: 网络


+ (instancetype)sharedTools {多线程

   

    static id instance;  //存储在静态区函数

  

    static dispatch_once_t onceToken; // dispatch_once_t 长整型  若是 onceToken 为0,就执行block中的代码, 只执行一次(一次性执行)工具

    

    dispatch_once(&onceToken, ^{spa

        instance = [[self alloc] init];  //dispatch_once 只是对这句代码加锁,保证block中的代码只执行一次.net

    });线程

    

    return instance;3d

}code



Swift中单例写法: 


法一:

  // 如下代码仿 OC 的写法!

    // Swift 中不容许在函数中定义静态成员

    static var instance: SoundTools?

    

    static var onceToken: dispatch_once_t = 0

    

    // 1. 提供全局的访问点

    class func sharedTools() -> SoundTools {    // class func类函数    //func 函数

        

        dispatch_once(&onceToken) { () -> Void in

            instance = SoundTools()

        }

        

        return instance!    //解包

    }


法二:

// 静态区的对象只能设置一次数值

static let sharedTools = SoundTools()


法三:

// Swift 中的的单例写法和懒加载几乎同样 `static let`

    // 一样也是在第一次使用时,才会建立对象

    static let sharedTools: SoundTools = {

       

        print("建立声音对象")

        

        return SoundTools()

    }()



附:

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 之类的来防止使用多个线程或者队列时不一样步的问题。

相关文章
相关标签/搜索