8

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

+0

Katastrofa prawdopodobnie znajduje się w kodzie wykonywalnym, dlaczego nie napiszesz tego kodu? – Ecarrion

+0

edytował post, aby zawrzeć te informacje. – splinter

+0

Ten błąd wystąpił w projekcie C++ podczas kopiowania obiektu ... jeśli to jest jakaś pomoc. – Ross

Odpowiedz

0

Nadal masz ten problem?

Dlaczego potrzebujesz w tym przypadku weakSelf. Wygląda na to, że nie chwytasz siebie w tej sytuacji. Czy kod nadal się zawiesza, gdy go opuszczasz?

btw, myślę, że twoja implementacja method1 stała się nieco chaotyczna, gdy próbujesz uprościć to pytanie.

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

Nie wygląda na prawidłową implementację metody. Czy nie powinno to być coś takiego:

- (void) method1: (void(^)(NSMutableArray *a)) completionBlock withFailedBlock:(void(^)(NSInteger errorCode,NSString *error)) failedBlock { 
    ... 
} 
Powiązane problemy