我正在使用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);
}];
调用代码:
[[Controller sharedController] method1:^(NSMutableArray *a) {
//save result in model (singleton)
[Model sharedModel].a = a;
[weakSelf refreshUI];
} withFailedBlock:^(NSInteger errorCode,NSString *error) {
;//show alert
}];
当我检查它周围的块和值时,它们似乎没问题。我也有NSZombie。 我的completionBlock应该被自动复制,因为它是从块中引用的。
我在这里缺少什么? 我也看过iOS5和4.3上的崩溃,但从来没有gdb远程返回错误:E08。调试器中的信息在这些情况下也没有帮助。我使用的是PLWeakCompatibility,因此我可以在iOS4.3下支持__weak
答案 0 :(得分:0)
你还有这个问题吗?
为什么在这种情况下你需要weakSelf。在这种情况下,你看起来并不像是在捕捉自我。你把它留下来时代码是否仍会崩溃?
不过,我认为当你试图为你的问题简化它时,你的method1实现有点乱。- (void) method1: (void(^)(NSMutableArray *a)) completionBlock withFailedBlock:(void(^)(NSInteger errorCode,NSString *error)) failedBlock {
...
} withFailedBlock:^(NSInteger errorCode, NSString *error) {
...
}];
看起来不像是有效的方法实现。不应该是这样的:
- (void) method1: (void(^)(NSMutableArray *a)) completionBlock withFailedBlock:(void(^)(NSInteger errorCode,NSString *error)) failedBlock {
...
}