Jak usunąć obserwatora z obiektu pod ARC ? Czy po prostu dodajemy obserwatora i zapominamy o jego usunięciu? Jeśli nie zarządzamy już pamięcią ręcznie, gdzie rezygnujemy z obserwacji?
Na przykład na kontrolerze widoku:
[self.view addObserver:self
forKeyPath:@"self.frame"
options:NSKeyValueObservingOptionNew
context:nil];
Wcześniej wywoływałbym metodę removeObserver:
kontrolera widoku dealloc
.
@"frame"
raczej keyPath niż@"self.frame"
?Odpowiedzi:
Nadal możesz wdrożyć w
-dealloc
ramach ARC, co wydaje się być odpowiednim miejscem do usunięcia obserwacji kluczowych wartości. Po prostu nie dzwonisz już[super dealloc]
z tej metody.Jeśli
-release
wcześniej dominowałeś, robiłeś coś w niewłaściwy sposób.źródło
[super dealloc]
. Kto jeszcze powinien to zrobić za Ciebie.[super dealloc]
metody dealloc. Nie mam pojęcia, jak by to działało podczas tworzenia podklasy wspomnianej klasy. Może po prostu wskazane jest użyciefinalize
zamiast tego (tam, gdzie dzwonisz[super finalize]
)[super dealloc]
last w tej metodzie jest prawie zawsze błędem przy ręcznym zarządzaniu pamięcią, kompilator obsługuje to teraz za Ciebie, dlatego nie możesz już wywoływać-dealloc
bezpośrednio. Jedyne, co umieszczasz w-dealloc
metodzie w ARC, to wszelkie zasoby niebędące obiektami, które musisz zwolnić, lub zadania czyszczenia, takie jak usuwanie obserwatorów. Sformułowanie, którego używają, jest trochę mętne, ale właśnie to miało na myśli.-finalize
jest używany do tego w ramach czyszczenia pamięci , gdzie-dealloc
nigdy nie jest wywoływany, ale umieszczenie tego kodu w-dealloc
ARC jest całkowicie dopuszczalne .[super dealloc]
jest wywoływana automatycznie, dlatego wywoływanie jej w ramach ARC jest błędem.Robię to z tym kodem
- (void)dealloc { @try{ [self.uAvatarImage removeObserver:self forKeyPath:@"image" context:nil]; } @catch(id anException) { //do nothing, obviously it wasn't attached because an exception was thrown } }
źródło
dealloc
? Za późno, żeby cokolwiek z tym zrobić.W innym miejscu na temat przepełnienia stosu Chris Hanson radzi użyć do tego celu metody finalize i zaimplementować oddzielną metodę unieważnienia, aby właściciele mogli powiedzieć obiektom, że są gotowe. W przeszłości stwierdziłem, że rozwiązania Hansona są dobrze przemyślane, więc będę się tym zajmował.
źródło
-dealloc
nigdy nie jest wywoływana. W ARC tak jest. Całkowicie akceptowalne jest usunięcie obserwatorów KVO w-dealloc
, jak wskazuje Chris Lattner (który wie, o czym mówi) na forach programistów Apple: devforums.apple.com/message/475850