8

Ich bin mit ARC und auf iOS6 someties ich einen seltsamen Absturz bekommen: GDB Remote einen Fehler zurückgegeben: E08GDB Remote einen Fehler zurückgegeben: E08 beim Aufruf Abschluss Block (EXC_BAD_ACCESS)

Im stacktrace das Verfahren vor ist in einer Zeile, die einen Completion-Block aufruft. Ich lese viel über Blöcke und ARC, aber ich bin immer noch nicht sicher, wenn sie im Zusammenhang mit Folling:

(vereinfachte Methoden und einige Code weggelassen)

- (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); 
}]; 

Code aufrufen:

[[Controller sharedController] method1:^(NSMutableArray *a) { 
    //save result in model (singleton) 
    [Model sharedModel].a = a; 
    [weakSelf refreshUI]; 

} withFailedBlock:^(NSInteger errorCode,NSString *error) { 
    ;//show alert 

}]; 

Wenn ich den Block und Werte um sie kontrollieren, scheinen sie jedoch in Ordnung. Ich habe auch NSZombie auf. Mein completionBlock sollte automatisch kopiert werden, da es aus dem Block verwiesen wird.

Was fehlt mir hier? Ich habe gesehen, stürzt auf iOS5 und 4.3 auch, aber nie remote einen Fehler zurückgegeben GDB: E08. Die Info vom Debugger war auch in diesen Fällen nicht hilfreich. Ich verwende PLWeakCompatibility so dass ich __weak unter iOS4.3

+0

Der Absturz ist wahrscheinlich in den Code, den der Block ausführt, warum postest du diesen Code nicht? – Ecarrion

+0

bearbeitet den Beitrag, um diese Informationen zu enthalten – splinter

+0

Ich habe diesen Fehler in einem C++ - Projekt beim Kopieren eines Objekts ... wenn das Hilfe ist. – Ross

Antwort

0

Haben Sie dieses Problem weiterhin unterstützen kann?

Warum brauchen Sie die weakSelf in diesem Fall. Es sieht nicht so aus, als würdest du dich in dieser Situation gefangen nehmen. Stürzt der Code immer noch ab, wenn Sie ihn auslassen?

btw, ich glaube, Ihre method1 Implementierung ein bisschen chaotisch bekam, wenn man versucht, es zu vereinfachen für Sie in Frage stellen.

- (void) method1: (void(^)(NSMutableArray *a)) completionBlock withFailedBlock:(void(^)(NSInteger errorCode,NSString *error)) failedBlock { 
    ... 
} withFailedBlock:^(NSInteger errorCode, NSString *error) { 
    ... 
}]; 

Sieht nicht wie eine gültige Methodenimplementierung aus. Sollte es nicht so etwas wie:

- (void) method1: (void(^)(NSMutableArray *a)) completionBlock withFailedBlock:(void(^)(NSInteger errorCode,NSString *error)) failedBlock { 
    ... 
} 
Verwandte Themen