慕田峪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
提交
取消
