2013-01-11 84 views
2

我有一個單獨的類的處理所有的遊戲中心的邏輯:塊= EXC_BAD_ACCESS

typedef void (^GameCenterCallbackFinishUpdating)(); 

- (void)getAllMatches:(GameCenterCallbackFinishUpdating)onComplete 
{ 
    [GKTurnBasedMatch loadMatchesWithCompletionHandler:^(NSArray *matches, NSError *error) 
    {  
     //Do stuff here... 
     onComplete(); 
    }]; 
} 

從另一個的viewController我用:

[[GameCenterHelper sharedHelper] getAllMatches:^{ 

    [self.myTableView reloadData]; 

}]; 

它的偉大工程,當我在應用程序,但一旦我關閉應用程序(背景),然後再次啓動它,我得到:

onComplete();  ---- Thread 1: EXC_BAD_ACCESS (code=2, address=0xc) 

我在做什麼錯在這裏?

+2

'if(onComplete)onComplete();' – holex

+0

That's works。謝謝!知道應用程序崩潰的原因仍然很有趣。 – BlackMouse

+1

,因爲這些塊是對象,並且如果任何塊是'nil',並且您嘗試調用它們,則會使應用程序崩潰。在某個地方以某種方式,這個區塊在你叫它之前變成'nil'。 'if(...)'語句可以幫助您防止調用'nil'指針,所以應用程序不會崩潰。 – holex

回答

9

一些背景資料:塊是對象,如果任何塊nil並嘗試給他們打電話,它的應用程序崩潰。

某個地方,在某種程度上,onComplete塊變成nil然後再調用它。以下if (...)語句可幫助您防止調用nil指針,因此應用程序不會崩潰。

if (onComplete) onComplete(); 
+1

「塊是對象」陳述似乎是無關緊要的,你能否提供更多關於信息如何與其餘答案相關的上下文? –

+1

是的,它看起來非常相關,因爲每個對象都可以是'nil'指針,而塊是對象而不是函數或方法。你想知道關於這個區塊的內容嗎? – holex

+0

這裏的術語有點不對。一個對象不能是'nil',但是你可以有一個指向'nil'的指針,因此這裏更重要的事實是變量'onComplete'沒有指向任何東西。在這一點上,它的行爲就像調用一個已被賦予「NULL」的函數指針,例如Crash –

0

感謝@holex和@ Paul.s解釋得很好。 我有類似的情況發送塊作爲方法參數(completionHandler)。

- (void)callX:(NSString *)xyz withCompletionHandler:(void (^)(NSString *response))completion 
{ 
    completion(something); 
} 

而且有兩種情況任我使用該塊,如:

[MyClass sharedInstance] callX:@"abc" withCompletionHandler:^(NSString *response) { 
    if (response) { 
     //do something 
    } 
}]; 

或該塊可以是nil作爲方法參數:

[MyClass sharedInstance] callX:@"abc" withCompletionHandler:nil]; 

在第二種情況下,當塊是通過nil作爲方法參數,這導致EXC_BAD_ACCESS完成()。因此,@ Holex指出這些塊是對象,並且如果任何塊是零,並且您嘗試調用它們,則會使應用程序崩潰。 單,如果可以節省我很多時間

- (void)callX:(NSString *)xyz withCompletionHandler:(void (^)(NSString *response))completion 
{ 
    if (completion) 
     completion(something); 
} 

P.S:這個解釋只是爲NERDS我一樣。 | 'L'|