美文网首页
iOS 单例开发模式的使用

iOS 单例开发模式的使用

作者: 罂粟之城 | 来源:发表于2019-03-26 00:35 被阅读0次

    单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为 单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例.一个类始终只能创建一个实例,这个类就是单例类。

    单例类 全局持有 。若有必要可创建 在释放,不过一般使用单例不会频繁的创建又使用,可若使用static静态类对象操作某个类即可实现单例实现的某些功能需求(注:创建单例类在释放是在前期考虑,保持当前对象类唯一,但是此方法并不建议使用,使用static即可实现所要效果)。

    单例类中即使用 
        ShareInstanchClass *instanceClass = [[ShareInstanchClass alloc]init];
        每次初始化使用的 instanceClass 这个单例类对象都是一样的,可直接 alloc init 后使用
    
        优点:
        1,实例控制
            单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
        2、灵活性
           因为类控制了实例化过程,所以类可以灵活更改实例化过程。
        缺点:
        1,开销
          虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。
        2,可能的开发混淆
              使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
        3,对象生存期
            不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于.NET Framework的语言),只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除对象实例,但这样会导致单例类中出现悬浮引用。
    

    如何在iOS中使用:

    OC语言中:
         +(SingleClass*)shareInstance(类方法)
        {
            //利用GCD创建一个单例模式
            //第一个参数predicate,该参数是检查后面第二个参数所代表的代码块是否被调用的谓词,第二个参数则是在整个应用程序中只会被调用一次的代码块。dispach_once函数中的代码块只会被执行一次,而且还是线程安全的。
            static SingleClass* single=nil;
            static dispatch_once_t once;
            dispatch_once(&once, ^{ 
                    single = [[SingleClass alloc]init];
            });
          return single;
        }   
    
    Swift语言中:       
            class var defaultSingle : SingalClass
             {
                struct Static {
                    static var onceToken : dispatch_once_t = 0
                    static var single:SingalClass? = nil
                                }
                    dispatch_once(&Static.onceToken) {
                // 保证只执行一次 为了线程安全
                    if(Static.single == nil) {
                              // 第一次执行肯定是空 所以执行判断体 第二次以后就不会执行判断了
                                Static.single = SingalClass() // 给结构体里面的single创建对象 使其不为空
                                                  }
                                                          }
                     return Static.single!
             }
        1.2及以后使用:
        class SwiftySingleton 
        {
           static let shared = SwiftySingleton() // “懒实例化”的全局变量会被自动放在dispatch_once块中[4] 
            private init(){}
        }
    

    单例+方法锁使用

    方法锁,作用为:当多个线程同时调用方法的时候,保证只有一个线程在使用该方法.例如:A和B同时调用 defaultSingleton 方法,如果A正在使用该方法,那么B就不能调用,直到A使用完成,B才会执行该方法.这个也保证单例对象的唯一性,避免初始化方法被同时多次执行.

     static Singleton *singleton = nil ;
     + (Singleton *)defaultSingleton{
    
         @synchronized(self){
             if (singleton == nil){
                 singleton = [[Singleton alloc] init] ;
             }
            }
             return singleton ;
     }
    

    相关文章

      网友评论

          本文标题:iOS 单例开发模式的使用

          本文链接:https://www.haomeiwen.com/subject/mofwvqtx.html