[英]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.