używam łuku i na iOS6 someties Dostaję dziwny trzask: gdb zdalny zwrócił błąd: E08gdb zdalny zwrócił błąd: E08 przy wywołaniu bloku zakończenia (EXC_BAD_ACCESS)
W stacktrace metody Before znajduje się w linii, która wywołuje blok zakończenia. Czytałem dużo o bloki i ARC, ale nadal nie jestem przekonany, przy stosowaniu ich w kontekście folling:
(uproszczone metody i pominąć niektóre kodu)
- (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);
}];
Telefoniczny kod:
[[Controller sharedController] method1:^(NSMutableArray *a) {
//save result in model (singleton)
[Model sharedModel].a = a;
[weakSelf refreshUI];
} withFailedBlock:^(NSInteger errorCode,NSString *error) {
;//show alert
}];
Kiedy sprawdzam blok i wartości wokół niego, wydaje się, że są w porządku. Mam też NSZombie na. Moja funkcja completionBlock powinna zostać automatycznie skopiowana, ponieważ odwołuje się do niej z bloku.
Czego mi tu brakuje? Widziałem także awarie na iOS5 i 4.3, ale nigdy zdalny pilot nie zwrócił błędu: E08. Informacje z debuggera również nie były pomocne w tych przypadkach. Używam PLWeakCompatibility, dzięki czemu mogę obsługiwać __weak pod iOS4.3
Katastrofa prawdopodobnie znajduje się w kodzie wykonywalnym, dlaczego nie napiszesz tego kodu? – Ecarrion
edytował post, aby zawrzeć te informacje. – splinter
Ten błąd wystąpił w projekcie C++ podczas kopiowania obiektu ... jeśli to jest jakaś pomoc. – Ross