2016-11-16 138 views
1

我已經使用這個NSDate Extension了一段時間,但現在它只是開始,同時呼籲崩潰[NSDate的currentCalendar]從multimple線程dateAtStartOfDay方法和一些TIEM我收到了崩潰與EXC_BAD_ACCESS和存儲地址。EXC_BAD_ACCESS類別訪問靜態成員

問題是,當我在同一時間從多個線程訪問該static NSCalendar *sharedCalendar時,我得到該錯誤。

共享訪問:

+ (NSCalendar *) currentCalendar 
{ 
    static NSCalendar *sharedCalendar = nil; 
    if (!sharedCalendar) 
     sharedCalendar = [NSCalendar autoupdatingCurrentCalendar]; 
    return sharedCalendar; 
} 

我怎樣才能解決這個問題?

這裏是錯誤:

enter image description here 和打印對象時:(有時[的NSDate currentCalendar]返回地址)

enter image description here

+0

'NSCalendar'不是線程安全的。您將不得不添加代碼以確保沒有對共享日曆的併發訪問。 – rmaddy

+0

@rmaddy這就是爲什麼該方法將日曆存儲到靜態變量中,請參閱更新後的問題。 –

+0

這並不改變你在多線程上同時在這個共享的靜態'NSCalendar'實例上調用方法的事實。 'NSCalendar'不支持。 – rmaddy

回答

1

行,就是現在所施加的溶液是:

+ (NSCalendar *)currentCalendar 
{ 
    dispatch_once(&onceToken, ^{ 
     sharedCalendar = [NSCalendar autoupdatingCurrentCalendar]; 
    }); 

    return sharedCalendar; 
} 

我剛剛包裝了的初始化3210在dispatch_once。近半年沒有問題。