創(chuàng)建一個單例很多辦法。我先列舉一個蘋果官方文檔中的寫法。
[cpp] view plaincopy
[cpp] view plaincopy
1. 線程安全。 2. 滿足靜態(tài)分析器的要求。 3. 兼容了ARC
然后我還有點好奇的是dispatch_once,這個函數(shù),沒見過啊。 于是就到官方的文檔里找找看,是怎么說的。 下面是官方文檔介紹:
dispatch_once Executes a block object once and only once for the lifetime of an application. void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block); Parameters predicate A pointer to a dispatch_once_t structure that is used to test whether the block has completed or not. block The block object to execute once. Discussion This function is useful for initialization of global data (singletons) in an application. Always call this function before using or testing any variables that are initialized by the block. If called simultaneously from multiple threads, this function waits synchronously until the block has completed. The predicate must point to a variable stored in global or static scope. The result of using a predicate with automatic or dynamic storage is undefined. Availability
Declared In dispatch/once.h
我們看到,該方法的作用就是執(zhí)行且在整個程序的聲明周期中,僅執(zhí)行一次某一個block對象。簡直就是為單例而生的嘛。而且,有些我們需要在程序開頭初始化的動作,如果為了保證其,僅執(zhí)行一次,也可以放到這個dispatch_once來執(zhí)行。 然后我們看到它需要一個斷言來確定這個代碼塊是否執(zhí)行,這個斷言的指針要保存起來,相對于第一種方法而言,還需要多保存一個指針。
方法簡介中就說的很清楚了:對于在應用中創(chuàng)建一個初始化一個全局的數(shù)據(jù)對象(單例模式),這個函數(shù)很有用。 如果同時在多線程中調(diào)用它,這個函數(shù)將等待同步等待,直至該block調(diào)用結束。 這個斷言的指針必須要全局化的保存,或者放在靜態(tài)區(qū)內(nèi)。使用存放在自動分配區(qū)域或者動態(tài)區(qū)域的斷言,dispatch_once執(zhí)行的結果是不可預知的。
總結:1.這個方法可以在創(chuàng)建單例或者某些初始化動作時使用,以保證其唯一性。2.該方法是線程安全的,所以請放心大膽的在子線程中使用。(前提是你的dispatch_once_t *predicate對象必須是全局或者靜態(tài)對象。這一點很重要,如果不能保證這一點,也就不能保證該方法只會被執(zhí)行一次。)
轉(zhuǎn):http://blog.sina.com.cn/s/blog_69081e0601019m1z.html ==================================== 大家知道,單例模式是ios里面經(jīng)常使用的模式,例如 [UIApplicationsharedApplication] (獲取當前應用程序?qū)ο?、[UIDevicecurrentDevice](獲取當前設備對象); 單例模式的寫法也很多。 第一種:
第二種:
第三種:
第三種是ARC下單例模式,也是比較方便的, 但是[[Singleton alloc] init];這種情況下就可以生成多個對象了,怎么辦呢,我們暫時先使用計數(shù)的方式來防止多次創(chuàng)建實例,如果大家有更好的方法,可以留言給我。謝謝~ 我們采用直接返回sharedInstance的方法進行創(chuàng)建。 ======================================================= 單例模式的意思就是只有一個實例。單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例。這個類稱為單例類。 #import <Foundation/Foundation.h> @interface Singleton : NSObject +(Singleton *) getInstance; //oneway用在分布式對象的API,這些API可以在不同的線程,甚至是不同的程序。oneway關鍵字只用在返回類型為void的消息定義中, 因為oneway是異步的,其消息預計不會立即返回。 -(oneway void)release { [super release]; } - (id) autorelease { return self; } @end 當然,ios 5以上啟用ARC就簡單多了: static RootViewController* sharedRootController = nil; +(RootViewController *) sharedController{ @synchronized(self){ if (sharedRootController == nil) { sharedRootController = [[self alloc] init]; } } return singleController; } |
|
來自: 沒原創(chuàng)_去搜索 > 《IOS開發(fā)》