一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

ios中單例模式的一點理解

 ccccshq 2014-03-11

單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統(tǒng)中一個類只有一個實例而且該實例易于外界訪問,從而方便對實例個數(shù)的控制并節(jié)約系統(tǒng)資源。如果希望在系統(tǒng)中某個類的對象只能存在一個,單例模式是最好的解決方案。

在Java中我們定義一個單例類:

  1. <span style="font-size:12px;">public class Singleton {  
  2.     private static Singleton uniqueInstance = null;  
  3.    
  4.     private Singleton() {  
  5.        // Exists only to defeat instantiation.  
  6.     }  
  7.    
  8.     public static Singleton getInstance() {  
  9.        if (uniqueInstance == null) {  
  10.            uniqueInstance = new Singleton();  
  11.        }  
  12.        return uniqueInstance;  
  13.     }  
  14.     // Other methods...  
  15. }</span>  

在ios中我們按照java那樣定義一個單例類,

  1. <span style="font-size:12px;">static DataModel *_sharedDataModel=nil;  
  2.   
  3. @implementation DataModel  
  4.   
  5.   
  6. +(DataModel *)sharedDataModel  
  7. {  
  8.   
  9.       
  10.     if (!_sharedDataModel)  
  11.     {  
  12.           
  13.         _sharedDataModel=[[self alloc] init];  
  14.           
  15.           
  16.     }  
  17.       
  18.   
  19.   
  20.   
  21.     return _sharedDataModel;  
  22.   
  23. }  
  24.   
  25.   
  26.   
  27.   
  28.   
  29.   
  30.   
  31. @end  
  32. </span>  

  1. <span style="font-size:12px;"DataModel *model1=[[DataModel alloc] init];  
  2.       
  3.       
  4.     DataModel *model2=[DataModel sharedDataModel];  
  5.       
  6.   
  7.       
  8.     NSLog(@"model1:%@",model1);  
  9.       
  10.     NSLog(@"model2:%@",model2);  
  11. </span>  

打印內存地址,我們發(fā)現(xiàn)內存地址不一樣,也就是說它們并沒有共用一個內存,

  1. <span style="font-size:12px;">2014-02-24 14:31:57.734 IOSStudy[833:a0b] model1:<DataModel: 0x8e24600>  
  2. 2014-02-24 14:31:57.735 IOSStudy[833:a0b] model2:<DataModel: 0x8e24610></span>  
顯然在ios中這樣定義單例類是不對的,查相關資料,發(fā)現(xiàn)
在objective-c中要實現(xiàn)一個單例類,至少需要做以下四個步驟:
1、為單例對象實現(xiàn)一個靜態(tài)實例,并初始化,然后設置成nil,
2、實現(xiàn)一個實例構造方法檢查上面聲明的靜態(tài)實例是否為nil,如果是則新建并返回一個本類的實例,
3、重寫allocWithZone方法,用來保證其他人直接使用alloc和init試圖獲得一個新實力的時候不產(chǎn)生一個新實例,
4、適當實現(xiàn)allocWitheZone,copyWithZone,release和autorelease。

疑問來了,allocWithZone是什么,和alloc有什么區(qū)別,為什么要重寫這個方法,查相關資料得知

在NSObject 這個類的官方文檔里面,allocWithZone方法介紹說,該方法的參數(shù)是被忽略的,正確的做法是傳nil或者NULL參數(shù)給它。而這個方法之所以存在,是歷史遺留原因。

Do not override allocWithZone: to include any initialization code. Instead, class-specific versions of init… methods.

This method exists for historical reasons; memory zones are no longer used by Objective-C.

文檔里面提到,memory zone已經(jīng)被棄用了,只是歷史原因才保留這個接口。詳細是什么歷史原因我沒找到,不過后面介紹的內容會稍微涉及到。

而實踐證明,使用alloc方法初始化一個類的實例的時候,默認是調用了 allocWithZone 的方法。于是覆蓋allocWithZone方法的原因已經(jīng)很明顯了:為了保持單例類實例的唯一性,需要覆蓋所有會生成新的實例的方法,如果有人初始化這個單例類的時候不走[[Class alloc] init] ,而是直接 allocWithZone, 那么這個單例就不再是單例了,所以必須把這個方法也堵上。

那么下面我們看看如何正確定義一個單例類:

  1. static DataModel *_sharedDataModel=nil;  
  2.   
  3. @implementation DataModel  
  4.   
  5.   
  6. +(DataModel *)sharedDataModel  
  7. {  
  8.   
  9.     //確保線程安全  
  10.     @synchronized(self)  
  11.     {  
  12.       
  13.         if (_sharedDataModel==nil)  
  14.         {  
  15.               
  16.             
  17.             [[self alloc] init];  
  18.         }  
  19.           
  20.           
  21.         return _sharedDataModel;  
  22.   
  23.     }  
  24.   
  25.     return _sharedDataModel;  
  26.   
  27. }  
  28.   
  29.   
  30. //重新allocWithZone方法  
  31. +(id) allocWithZone:(struct _NSZone *)zone  
  32. {  
  33.   
  34.   
  35.     @synchronized(self)  
  36.     {  
  37.       
  38.         if (_sharedDataModel==nil)  
  39.         {  
  40.               
  41.             _sharedDataModel=[super allocWithZone:zone];  
  42.               
  43.             return _sharedDataModel;  
  44.         }  
  45.       
  46.       
  47.       
  48.       
  49.     }  
  50.       
  51.     return nil;  
  52.       
  53.   
  54. }  
  55.   
  56. //確保copy對象也是唯一的  
  57. -(idcopy  
  58. {  
  59.   
  60.   
  61.     return self;  
  62.   
  63. }  
  64.   
  65.   
  66. //確保計數(shù)唯一  
  67. -(idretain  
  68. {  
  69.   
  70.   
  71.     return self;  
  72.   
  73.   
  74. }  
  75.   
  76. -(unsigned) retainCount  
  77. {  
  78.   
  79.   
  80.     return UINT_MAX;  
  81.   
  82.   
  83. }  
  84.   
  85. //oneway以表示該方法是用于異步消息的  
  86. -(oneway void) release  
  87. {  
  88.   
  89.   
  90.   
  91. }  
  92.   
  93.   
  94. -(id) autorelease  
  95. {  
  96.   
  97.   
  98.     return self;  
  99.   
  100. }  
  1. DataModel *model1=[[DataModel alloc] init];  
  2.       
  3.       
  4.     DataModel *model2=[DataModel sharedDataModel];  
  5.       
  6.   
  7.     DataModel *model3=[model1 copy];  
  8.       
  9.     NSLog(@"model1:%@",model1);  
  10.       
  11.     NSLog(@"model2:%@",model2);  
  12.       
  13.     NSLog(@"model3:%@",model3);  
  1. 2014-02-24 15:31:53.017 IOSStudy[1114:a0b] model1:<DataModel: 0xa063c30>  
  2. 2014-02-24 15:31:53.018 IOSStudy[1114:a0b] model2:<DataModel: 0xa063c30>  
  3. 2014-02-24 15:31:53.019 IOSStudy[1114:a0b] model3:<DataModel: 0xa063c30>  
我們看打印結果,內存地址一樣,說明DataModel類只初始化一次

貌似在ARC模式下,還有這種方式

  1. @implementation DZSinglonARC  
  2. +  (DZSinglonARC*) shareInstance  
  3. {  
  4.     static DZSinglonARC* share = nil;  
  5.     static dispatch_once_t onceToken;  
  6.     dispatch_once(&onceToken, ^{  
  7.         share = [[super allocWithZone:NULL] init];  
  8.     });  
  9.     return share;  
  10. }  
  11. + (instancetype) allocWithZone:(struct _NSZone *)zone  
  12. {  
  13.     return [self shareInstance];  
  14. }  
  15. @end  

如果還有其他的一些定義單例類的方式,大家可以說出來,相互學習~~~~

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产丝袜极品黑色高跟鞋| 欧美欧美日韩综合一区| 亚洲一区二区欧美激情| 国产色第一区不卡高清| 日韩欧美三级视频在线| 欧美成人久久久免费播放| 欧美一区二区三区不卡高清视| 日韩欧美二区中文字幕| 亚洲欧美中文日韩综合| 亚洲午夜av久久久精品| 一本久道久久综合中文字幕| 国产精品亚洲综合天堂夜夜| 91欧美日韩一区人妻少妇| 激情国产白嫩美女在线观看| 免费播放一区二区三区四区| 亚洲欧洲在线一区二区三区| 婷婷色网视频在线播放| 99一级特黄色性生活片| 亚洲中文字幕乱码亚洲| 99久久国产精品免费| 中文字幕久热精品视频在线| 国产色第一区不卡高清| 久久精品国产熟女精品| 日韩欧美91在线视频| 丰满人妻熟妇乱又乱精品古代| 欧美区一区二区在线观看| 欧美日韩一区二区三区色拉拉| 欧美午夜视频免费观看| 美日韩一区二区精品系列| 高清欧美大片免费在线观看| 欧美同性视频免费观看| 欧洲偷拍视频中文字幕| 中文字幕人妻综合一区二区 | 亚洲国产av在线视频| 亚洲熟女一区二区三四区| 国产内射在线激情一区| 亚洲中文在线男人的天堂| 日韩高清一区二区三区四区| 日韩欧美一区二区不卡视频| 欧美人与动牲交a精品| 日韩一区二区三区四区乱码视频|