天天看點

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之類的來防止使用多個線程或者隊列時不同步的問題。

程式猿神奇的手,每時每刻,這雙手都在改變着世界的互動方式!

本文轉自當天真遇到現實部落格園部落格,原文連結:http://www.cnblogs.com/XYQ-208910/p/4856387.html,如需轉載請自行聯系原作者

繼續閱讀