【问题标题】:gdb remote returned an error: E08 when calling completion block (EXC_BAD_ACCESS)gdb 远程返回错误:调用完成块时出现 E08 (EXC_BAD_ACCESS)
【发布时间】: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


【解决方案1】:

你还有这个问题吗?

在这种情况下你为什么需要weakSelf。在这种情况下,您看起来不像是在捕捉自我。不写代码还会崩溃吗?

顺便说一句,我认为当您尝试为您的问题简化它时,您的方法 1 实现有点混乱。

- (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 {
    ...
}

【讨论】:

    猜你喜欢
    • 2012-11-28
    • 2020-07-25
    • 2010-10-16
    • 2013-09-22
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    相关资源
    最近更新 更多