8

我使用ARC和iOS6的我someties收到一條奇怪的崩潰: GDB遠程返回了一個錯誤:E08GDB遠程返回了一個錯誤:E08時調用完成塊(EXC_BAD_ACCESS)

在堆棧跟蹤前的方法在一個叫完成塊的行上。我讀了很多關於塊和ARC,但在folling環境中使用它們的時候我仍然不相信:

(簡化的方法和留下了一些代碼)

- (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

+0

崩潰可能是在代碼塊執行,你爲什麼不張貼該代碼? – Ecarrion

+0

編輯帖子以包含此信息 – splinter

+0

複製對象時,我在C++項目上出現此錯誤......如果有任何幫助。 – Ross

回答

0

下支持你仍然有這個問題__weak?

爲什麼在這種情況下你需要weakSelf。這看起來並不像你在這種情況下捕捉自我。代碼在離開時仍會崩潰嗎?

順便說一句,我覺得你的方法一實現了有點混亂,當你試圖爲你的問題簡化它。

- (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 { 
    ... 
} 
相關問題