国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

Objective-C(iOS)嚴格單例模式正確實現(xiàn)

2019-11-14 18:10:56
字體:
供稿:網(wǎng)友

注:本文所有權(quán)歸作者所有,轉(zhuǎn)載請注明出處  

  當希望在一個應(yīng)用程序中某個類的對象只能存在一個的時候就可以考慮用單例模式來實現(xiàn),單例模式在C++中比較容易實現(xiàn)(只需把構(gòu)造函數(shù)聲明為PRivate),而在Objective-C中對象可以通過NSObject的alloc來產(chǎn)生,所以需要編寫一些額外的代碼來確保對象的唯一性,考慮到現(xiàn)在編寫iOS APP代碼幾乎都是ARC方式,且GCD也已經(jīng)被用爛了,故本文給出一種利用GCD技術(shù)來實現(xiàn)嚴格單例模式的ARC版本,具體代碼如下所示,所有的注意點都寫在了注釋里面:

 1 Singleton.h 2 @interface Singleton : NSObject 3 @property(nonatomic,strong) NSString *name; 4 +(Singleton*)defaultManager; 5 @end 6  7  8 Singleton.m 9 @implementation Singleton10 //單例類的靜態(tài)實例對象,因?qū)ο笮枰ㄒ恍裕手荒苁莝tatic類型11 static Singleton *defaultManager = nil;12 13 /**單例模式對外的唯一接口,用到的dispatch_once函數(shù)在一個應(yīng)用程序內(nèi)只會執(zhí)行一次,且dispatch_once能確保線程安全14 */15 +(Singleton*)defaultManager16 {17     static dispatch_once_t token;18     dispatch_once(&token, ^{19         if(defaultManager == nil)20         {21             defaultManager = [[self alloc] init];22         }23     });24     return defaultManager;25 }26 27 /**覆蓋該方法主要確保當用戶通過[[Singleton alloc] init]創(chuàng)建對象時對象的唯一性,alloc方法會調(diào)用該方法,只不過zone參數(shù)默認為nil,因該類覆蓋了allocWithZone方法,所以只能通過其父類分配內(nèi)存,即[super allocWithZone:zone]28  */29 +(id)allocWithZone:(struct _NSZone *)zone30 {31    static dispatch_once_t token;32     dispatch_once(&token, ^{33         if(defaultManager == nil)34         {35             defaultManager = [super allocWithZone:zone];36         }37     });38     return defaultManager;39 }40 //自定義初始化方法,本例中只有name這一屬性41 - (instancetype)init42 {43     self = [super init];44     if(self)45     {46         self.name = @"Singleton";47     }48     return self;49 }50 51 //覆蓋該方法主要確保當用戶通過copy方法產(chǎn)生對象時對象的唯一性52 - (id)copy53 {54     return self;55 }56 57 //覆蓋該方法主要確保當用戶通過mutableCopy方法產(chǎn)生對象時對象的唯一性58 - (id)mutableCopy59 {60     return self;61 }62 //自定義描述信息,用于log詳細打印63 - (NSString *)description64 {65     return [NSString stringWithFormat:@"memeory address:%p,property name:%@",self,self.name];66 }

測試代碼如下:

 1 Singleton *defaultManagerSingleton =[Singleton defaultManager]; 2 NSLog(@"defaultManagerSingleton:/n%@",defaultManagerSingleton); 3 Singleton *allocSingleton = [[Singleton alloc] init]; 4 NSLog(@"allocSingleton:/n%@",allocSingleton); 5 Singleton *copySingleton = [allocSingleton copy]; 6 NSLog(@"copySingleton:/n%@",copySingleton); 7 Singleton *mutebleCopySingleton = [allocSingleton mutableCopy]; 8 NSLog(@"mutebleCopySingleton:/n%@",mutebleCopySingleton); 9 10 //打印結(jié)果11 2015-10-11 21:48:34.722 Singleton[1941:214584] defaultManagerSingleton:12 memeory address:0x7fa6d1591530,property name:Singleton13 2015-10-11 21:48:34.727 Singleton[1941:214584] allocSingleton:14 memeory address:0x7fa6d1591530,property name:Singleton15 2015-10-11 21:48:34.727 Singleton[1941:214584] copySingleton:16 memeory address:0x7fa6d1591530,property name:Singleton17 2015-10-11 21:48:34.727 Singleton[1941:214584] mutebleCopySingleton:18 memeory address:0x7fa6d1591530,property name:Singleton

從打印結(jié)果來看通過 [Singleton defaultManager]、[[Singleton alloc] init]、[allocSingleton copy]、[allocSingleton mutableCopy]這四種方法生成的對象地址都是0x7fa6d1591530,即表明對象是同一個,也就實現(xiàn)了嚴格單例模式,加上GCD是線程安全的所以在多線程中也能保證對象的唯一性。

另:在學習Objective-C編寫單例模式時看到網(wǎng)上好多人都借用蘋果官方的實現(xiàn)方式,但我自己始終沒搜到官方的實現(xiàn)Sample代碼,如果你知道麻煩把網(wǎng)址給我發(fā)下,謝謝哈~


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 白银市| 平安县| 潜江市| 西和县| 肥东县| 五华县| 无锡市| 蕉岭县| 甘孜| 兖州市| 麻阳| 五大连池市| 延寿县| 永仁县| 琼海市| 玉环县| 郧西县| 永吉县| 建昌县| 久治县| 郴州市| 区。| 怀宁县| 台南县| 朝阳区| 三穗县| 藁城市| 页游| 铜川市| 神木县| 宜州市| 静海县| 阳江市| 信丰县| 崇礼县| 沅陵县| 临湘市| 阿合奇县| 博湖县| 延安市| 永福县|