簡體   English   中英

塊內阻止= EXC_BAD_ACCESS

[英]Block inside block = EXC_BAD_ACCESS

我有一個單例類處理所有Game Center邏輯:

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)

我在這做錯了什么?

一些背景信息:塊是對象,如果任何塊是 nil 並且你試圖調用它們,它會崩潰應用程序。

在某個地方以某種方式,在你調用之前,塊onComplete變為nil 以下if (...)語句可以幫助您防止調用nil指針,因此應用程序不會崩潰。

if (onComplete) onComplete();

感謝@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完成時導致EXC_BAD_ACCESS () 因此@holex聲明塊是對象,如果任何塊是nil並且你試圖調用它們,它會崩潰應用程序。 單個如果節省了我很多時間

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

PS:這個解釋僅適用NERDS像我這樣的NERDS | 'L'|

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM