阻止内部块= 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’|