慕田峪9158850
2019-05-27 15:09:27
我的Objective-C單身人物應該是什么樣的?我的單例訪問器方法通常是以下的一些變體:static MyClass *gInstance = NULL;+ (MyClass *)instance{
@synchronized(self)
{
if (gInstance == NULL)
gInstance = [[self alloc] init];
}
return(gInstance);}我可以做些什么來改善這個?
3 回答

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

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

大話西游666
TA貢獻1817條經驗 獲得超14個贊
一個線程安全的單例,試圖避免鎖定成本,我想我也會拋出一個:
#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; }
好的,讓我解釋一下這是如何工作的:
快速情況:在正常執行
sharedInstance
中已經設置好了,所以while
循環永遠不會執行,只需測試變量的存在就會返回函數;慢速情況:如果
sharedInstance
不存在,則使用比較和交換('CAS')分配實例并將其復制到其中;爭鳴情況:如果兩個線程都試圖調用
sharedInstance
在同一時間和sharedInstance
同一時間不存在,那么他們都將初始化為CAS是單身主義者和嘗試的新實例到位。無論哪一個贏得CAS立即返回,無論哪一個失去釋放它剛剛分配的實例并返回(現在設置)sharedInstance
。單個OSAtomicCompareAndSwapPtrBarrier
作為設置線程的寫屏障和來自測試線程的讀屏障。
添加回答
舉報
0/150
提交
取消