【发布时间】:2012-09-30 08:00:57
【问题描述】:
我正在使用 ARC,在 iOS6 上我有时会遇到奇怪的崩溃: gdb远程返回错误: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。 我的完成块应该被自动复制,因为它是从块中引用的。
我在这里缺少什么? 我在 iOS5 和 4.3 上也看到过崩溃,但从来没有 gdb remote 返回错误:E08。在这些情况下,来自调试器的信息也没有帮助。我正在使用PLWeakCompatibility,以便在iOS4.3下支持__weak
【问题讨论】:
-
崩溃可能在block执行的代码中,你为什么不发布那个代码?
-
编辑帖子以包含此信息
-
复制对象时,我在 c++ 项目中遇到此错误...如果有帮助的话。
-
实际上我正在向复制运算符发送任何未正确初始化/未定义的指针。
标签: objective-c automatic-ref-counting ios6 objective-c-blocks