8

Ben ARC kullanıyorum ve iOS6 üzerinde garip bir kilitlenme almak someties çağıran: stacktrace yöntemi önce de E08gdb uzak bir hata verdi: E08 zaman tamamlama bloğu (EXC_BAD_ACCESS)

: gdb uzak bir hata döndürdü bir tamamlama bloğu çağıran bir satır üzerindedir. Ben blokları ve ARC hakkında çok şey okudum ama folling bağlamında bunları kullanırken hala emin değilim:

(basitleştirilmiş yöntem ve bazı kod dışında kalan) kodu çağırarak

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

:

Buradaki bloğu ve değerleri incelediğimde, yine de iyi görünüyorlar. Ayrıca NSZombie var. TamamlamaBlock'um, blok içinde referans alındığı için otomatik olarak kopyalanmalıdır.

Burada nelerin eksik? Ayrıca, iOS5 ve 4.3 de kilitlenme gördük, ama gdb uzaktan bir hata döndürdü: E08. Hata ayıklayıcıdaki bilgiler de bu durumlarda yardımcı olmadı. PLWeakCompatibility kullanıyorum, böylece iOS4.3

+0

Çarpışma, büyük olasılıkla kodun çalıştırıldığı koddadır, neden bu kodu yayınlamıyorsunuz? – Ecarrion

+0

Bu bilgiyi – splinter

+0

içerecek şekilde düzenledim Bir nesneyi kopyalarken bir C++ projesinde bu hatayı aldım ... eğer bu bir yardımsa. – Ross

cevap

0

altında __weak'i destekleyebilirim Bu sorunu hala yaşıyor musunuz?

Bu durumda neden zayıfSize ihtiyacınız var? Bu durumda kendini yakaladığın gibi görünmüyor. Dışarı çıktığınızda kod hala çöküyor mu?

btw, sanırım siz soru için basitleştirmeye çalıştığınızda method1 uygulamanız biraz dağınık oldu.

Geçerli bir yöntem uygulaması gibi görünmüyor. Olması gereken bir şey olmamalıdır:

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