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


单例 :一般应用在 网络工具、音频工具


OC中单例写法: 


+ (instancetype)sharedTools {

   

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

  

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

    

    dispatch_once(&onceToken, ^{

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

    });

    

    return instance;

}



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


转载于:https://my.oschina.net/TaciturnKnightYQ/blog/538110

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值