2009-06-17 17 views
6

Czy to ma znaczenie, czy najpierw nazywam metodę super klasy, czy na końcu? Na przykładCzy czas wywołania metody super klasy jest ważny w ObjectiveC?

-(void)didReceiveMemoryWarning { 
    /* do a bunch of stuff */ 

    [super didReceiveMemoryWarning]; 
} 

kontra

-(void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 

    /* do a bunch of stuff */ 
} 

samym pytaniem do innych metod, takich jak viewWillAppear, willRotateToInterfaceOrientation itp

szukam znaczących różnic, a nie tylko stylistycznych lub filozoficznych (chociaż te są mile widziane także).

Odpowiedz

6

Typowa konwencja Kakao:

  1. Jeśli instalacja jest przeprowadzana, zadzwoń Super PIERWSZY
  2. If wykonujesz odrzucenia, zadzwoń super OSTATNIE

Tak więc inicjalizacja, viewDidLoad, itp. Należą do pierwszego przypadku. Ostrzeżenia dotyczące pamięci, viewDidUnload i dealloc mieszczą się w drugim przypadku.

Powinieneś również zaprojektować swoje klasy zgodnie z tą konwencją. Wszelkie odchylenia należy wyraźnie odnotować.

Podobne SO odpowiedzieć:

`[super viewDidLoad]` convention


Aby dodać: Uzasadnieniem nazywając Super najpierw podczas instalacji, jest to, że chcesz się upewnić, że wszystko jest na swoim miejscu, zanim rozszerzyć funkcjonalność. Następstwem tego jest to, że gdy przenosisz pieniądze, nie chcesz, aby jakakolwiek superklasa ivars, której twoja podklasa jest uzależniona, była deallokowana, zanim będziesz miał szansę sobie z nimi poradzić.

Ma to sens w odniesieniu do aktualizacji interfejsu użytkownika, jak również odnotowano w komentarzach poniżej.

+0

Jak klasyfikowałbyś WillRotateToInterfaceOrientation w tej ocenie? – fnCzar

+2

Moim zdaniem, powiedziałbym, że to konfiguracja. Sądzę, że chcesz, aby super klasa wykonywała rotacje swoich obiektów (które najprawdopodobniej zawierają obiekt widoku głównego), a następnie chciałbyś obsłużyć twoje (które są najprawdopodobniej subskrybentami) po tym, jak to nastąpi. –

6

To zależy od funkcjonalności, albo chcesz coś zrobić po tym, jak super klasa zrobiła coś, albo wcześniej.

Na przykład, jeśli nadklasa posiada pewne elementy interfejsu użytkownika, a rozszerzasz ją, a twoja klasa będzie zawierała więcej elementów interfejsu użytkownika. Aby dopasować rozmiar do całego obiektu, prawdopodobnie nazwiesz super-klasę, aby obliczyć rozmiar jego elementów, a następnie dodasz do tego rozmiaru rozmiar dodanych elementów.

W przeciwnym razie nie ma sensu - super klasa nie zna swoich elementów, aby nadpisać obliczenia. Znowu zależy to od implementacji.

Jest to szczególny przypadek, gdzie trzeba wywołać metodę super-jak ostatnia rzecz:

-(void)dealloc 
{ 
    ... 
    [super dealloc]; 
} 
Powiązane problemy