我正在使用ARC而且在iOS6上我遇到了一个奇怪的崩溃:gdb remote返回了一个错误:E08
在堆栈跟踪中,之前的方法位于调用完成块的行上.我读了很多关于块和ARC的内容,但是我仍然对在后台环境中使用它们没有信心:
(简化方法并遗漏了一些代码)
- (void) method1: (void(^)(NSMutableArray *a)) completionBlock withFailedBlock:(void(^)(NSInteger errorCode,NSString *error)) failedBlock {
__weak Controller *weakSelf = self;
...
if(condition)
completionBlock(weakSelf.a);
//still do method2, since we might get updated data
[weakself.service method2:^(NSMutableArray *a2) {
weakSelf.shouldRefresh = NO;
...
completionBlock(a2); //<-- sometimes crashes here
} withFailedBlock:^(NSInteger errorCode, NSString *error) {
failedBlock(errorCode, error);
}];
} withFailedBlock:^(NSInteger errorCode, NSString *error) {
failedBlock(errorCode, error);
}];
Run Code Online (Sandbox Code Playgroud)
调用代码:
[[Controller sharedController] method1:^(NSMutableArray *a) {
//save result in model (singleton)
[Model sharedModel].a = a;
[weakSelf refreshUI]; …Run Code Online (Sandbox Code Playgroud)