zoukankan      html  css  js  c++  java
  • iOS:创建单例对象的两种方式

    单例模式:创建单例对象的两种方式


    方式一:iOS4版本之前
         static SingleClassManager *singleManager = nil;
         +(SingleClassManager*)sharedManager
         {
                 @synchronized(self)  //同步加锁,在多线程中使用,可以使线程安全
                 {             
                       if(singleManager == nil)
                        {
                                  singleManager = [[SingleClassManager alloc]init];
                        } 
                  }
               return singleManager;
          }
     
     
    方式二:iOS5版本开始(block函数)
        +(SingleClassManager *)sharedManager
        {
              static SingleClassManager *singleManager = nil;
              static dispatch_once_t  predicate;
              dispatch_once(&predicate,^{
                  singleManager = [[SingleClassManager alloc]init];
              });
              return singleManager;
        }
        该方法有很多优势: 
               1 线程安全
               2 很好满足静态分析器要求
               3 和自动引用计数(ARC)兼容 
               4 仅需要少量代码
         说明:
                该函数接收一个dispatch_once用于检查该代码块是否已经被调度的谓词(是一个长整型,实际上作为BOOL使用)。它还接收一个希望在应用的生命周期内仅被调度一次的代码块,对于本例就用于shared实例的实例化。
    dispatch_once不仅意味着代码仅会被运行一次,而且还是线程安全的,这就意味着你不需要使用诸如@synchronized之类的来防止使用多个线程或者队列时不同步的问题。
  • 相关阅读:
    段间跳转之陷阱门
    段间跳转之中断门
    段间跳转之调用门
    代码段段间跳转流程
    Window内核学习之保护模式基础
    回顾2020,展望2021
    内存管理之堆
    Windows进程间通讯(IPC)----信号量
    线程本地存储(动态TLS和静态TLS)
    Windows进程间通讯(IPC)----套接字
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/4856387.html
Copyright © 2011-2022 走看看