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