2011-08-18 17 views
16

O ile mi zrozumieć Blok działa jak przedmiot, na który można wysłać kopię lub zwolnić wiadomości do niego, np:EXC_BAD_ACCESS podczas kopiowania lub zachowaniu Blok

[myBlock copy]; 

Jednak ilekroć to zrobić, lub uwalnianie blok, dostaję EXC_BAD_ACCESS.

Jeśli używam funkcji blokowych, wszystko działa zgodnie z oczekiwaniami, np .:

Block_copy(myBlock); 

Myślałem oba sposoby uwalniania i blokuje kopiowania były identyczne?

To nie jest żaden problem, ale jest trochę irytujące, że jeśli mam własność (kopię), która jest blokiem, muszę napisać metodę ustawiacza samodzielnie.

Na przykład: Z Właściwości:

//Header 
@property (nonatomic, copy) void (^cancelledBlock)(void); 

//Implementation 
@sythesize cancelledBlock; 

prowadzi do EXC_BAD_ACCESS podczas ustawiania cancelledBlock

ale jeśli robię:

//Header 
@property (nonatomic, copy) void (^cancelledBlock)(void); 

//Implementation 
@sythesize cancelledBlock; //saves me doing the getter as well 

- (void)setCancelledBlock:(void (^)(void))aCancelledBlock { 
    if (cancelledBlock == aCancelledBlock) { 
     return; 
    } 
    void (^oldValue)(void) = cancelledBlock; 
    cancelledBlock = Block_copy(aCancelledBlock); 
    Block_release(oldValue); 

} 

nie ma EXC_BAD_ACCESS i wszystko działa tak jak powinno.

+0

Powinieneś zwolnić to, co wcześniej zatrzymałeś lub skopiowałeś. – Richard

+0

Wiem, że jak mówię w moim pytaniu próbującym zrobić "[myBlock copy]" daje EXC_BAD_ACCESS, ale 'Block_copy (myBlock)' nie jest –

+0

Czy możesz pokazać nam pełny przykład? –

Odpowiedz

26

Po długim i nudnym popołudniu i wieczorem w końcu natknąłem się na to answer here, chociaż może się wydawać, że nie ma to związku z łańcuchem stron internetowych, które odwiedziłem, aby go znaleźć, tworzy tę relację.

Zasadniczo musiałem usunąć -weak_library /usr/lib/libSystem.B.dylib z flag łącznika i zastąpić go -weak-lSystem.

+0

Dziękuję, Jonathan! Po ponad 4 godzinach rozwiązałeś mój problem! –

+0

Whoa. Dosłownie spędziłem tygodnie próbując wyśledzić, co spowodowało awarię mojej aplikacji podczas uruchamiania w symulatorze. Ta odpowiedź to zrobiła. Dziękuję bardzo! –

+0

Wiem, jak denerwujący jest ten problem, chciałbym tylko wiedzieć, dlaczego to rozwiązanie działa. –

Powiązane problemy