亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我的Objective-C單身人物應該是什么樣的?

我的Objective-C單身人物應該是什么樣的?

我的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];
    }}


查看完整回答
反對 回復 2019-05-27
?
偶然的你

TA貢獻1841條經驗 獲得超3個贊

根據我在下面的其他答案,我認為你應該這樣做:

+ (id)sharedFoo{
    static dispatch_once_t once;
    static MyFoo *sharedFoo;
    dispatch_once(&once, ^ { sharedFoo = [[self alloc] init]; });
    return sharedFoo;}


查看完整回答
反對 回復 2019-05-27
?
大話西游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;                                                                        }

好的,讓我解釋一下這是如何工作的:

  1. 快速情況:在正常執行sharedInstance中已經設置好了,所以while循環永遠不會執行,只需測試變量的存在就會返回函數;

  2. 慢速情況:如果sharedInstance不存在,則使用比較和交換('CAS')分配實例并將其復制到其中;

  3. 爭鳴情況:如果兩個線程都試圖調用sharedInstance在同一時間 sharedInstance同一時間不存在,那么他們都將初始化為CAS是單身主義者和嘗試的新實例到位。無論哪一個贏得CAS立即返回,無論哪一個失去釋放它剛剛分配的實例并返回(現在設置)sharedInstance。單個OSAtomicCompareAndSwapPtrBarrier作為設置線程的寫屏障和來自測試線程的讀屏障。


查看完整回答
反對 回復 2019-05-27
  • 3 回答
  • 0 關注
  • 743 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號