3 回答

TA貢獻(xiàn)1809條經(jīng)驗(yàn) 獲得超8個(gè)贊
另一種選擇是使用該+(void)initialize
方法。從文檔:
運(yùn)行時(shí)
initialize
在程序之前恰好一次發(fā)送給程序中的每個(gè)類(lèi),或者從程序中發(fā)送它的第一個(gè)消息。(因此,如果未使用該類(lèi),則永遠(yuǎn)不會(huì)調(diào)用該方法。)運(yùn)行時(shí)initialize
以線(xiàn)程安全的方式將消息發(fā)送到類(lèi)。超類(lèi)在其子類(lèi)之前接收此消息。
所以你可以做類(lèi)似于此的事情:
static MySingleton *sharedSingleton;+ (void)initialize{ static BOOL initialized = NO; if(!initialized) { initialized = YES; sharedSingleton = [[MySingleton alloc] init]; }}

TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個(gè)贊
根據(jù)我在下面的其他答案,我認(rèn)為你應(yīng)該這樣做:
+ (id)sharedFoo{ static dispatch_once_t once; static MyFoo *sharedFoo; dispatch_once(&once, ^ { sharedFoo = [[self alloc] init]; }); return sharedFoo;}

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超14個(gè)贊
一個(gè)線(xiàn)程安全的單例,試圖避免鎖定成本,我想我也會(huì)拋出一個(gè):
#import <libkern/OSAtomic.h>static void * volatile sharedInstance = nil; + (className *) sharedInstance { while (!sharedInstance) { className *temp = [[self alloc] init]; if(!OSAtomicCompareAndSwapPtrBarrier(0x0, temp, &sharedInstance)) { [temp release]; } } return sharedInstance; }
好的,讓我解釋一下這是如何工作的:
快速情況:在正常執(zhí)行
sharedInstance
中已經(jīng)設(shè)置好了,所以while
循環(huán)永遠(yuǎn)不會(huì)執(zhí)行,只需測(cè)試變量的存在就會(huì)返回函數(shù);慢速情況:如果
sharedInstance
不存在,則使用比較和交換('CAS')分配實(shí)例并將其復(fù)制到其中;爭(zhēng)鳴情況:如果兩個(gè)線(xiàn)程都試圖調(diào)用
sharedInstance
在同一時(shí)間和sharedInstance
同一時(shí)間不存在,那么他們都將初始化為CAS是單身主義者和嘗試的新實(shí)例到位。無(wú)論哪一個(gè)贏得CAS立即返回,無(wú)論哪一個(gè)失去釋放它剛剛分配的實(shí)例并返回(現(xiàn)在設(shè)置)sharedInstance
。單個(gè)OSAtomicCompareAndSwapPtrBarrier
作為設(shè)置線(xiàn)程的寫(xiě)屏障和來(lái)自測(cè)試線(xiàn)程的讀屏障。
添加回答
舉報(bào)