2013-04-17 84 views
-2

嗨我有一個問題,當我嘗試獲取全局變量或設置值的值。 該代碼是在應用程序生命週期的applicationDidEnterBackground方法,這對我的作品的時候,我需要知道在實時呼叫的狀態,但有時這產生EXC_BAD_ACCESSEXC_BAD_ACCESS塊異步與ARC

這是變量聲明@property(nonatomic, copy) NSNumber *calling;,這是在我的.h文件。

這是我的我的.m實現文件的代碼:

__unsafe_unretained typeof(self) weakSelf = self; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

    @autoreleasepool 
    { 
     while (weakSelf.calling.intValue == 1) 
     { 
      callCenter.callEventHandler = ^(CTCall* call) 
      { 
       if([call.callState isEqualToString:CTCallStateDisconnected]) 
       { 
        weakSelf.calling = [[NSNumber numberWithInt:0] copy];//Error EXC_BAD_ACCESS 

       } 

      }; 
     } 
    } 
}); 

但有時產生錯誤和其他時間不。任何想法?

+1

用__weak替換'__unsafe_unretained'。當被引用的對象被釋放時,弱變量會自動被設置爲「nil」。 – rmaddy

+0

另外,你爲什麼要在不可變的'NSNumber'對象上調用'copy'? – rmaddy

+0

我用__weak但這不起作用,我刪除了NSNumber的副本,但它不工作,:( – kakashy

回答

4

停止使用此weakSelf。沒有必要。 self不保留此塊。沒有保留週期。

當你說__weak「不工作」,它是self已經由當時的塊的運行,所以弱引用已被設置爲nil,這樣的消息給它什麼都不做釋放的跡象。這也是爲什麼__unsafe_unretained崩潰 - self已被釋放;沒有__weak將其設置爲nil,它是一個懸掛指針。