2010-10-11 15 views
22

Jakie jest najlepsze użycie [super ... any method name]. Niedawno dowiedziałem się, że w Dealloc [super dealloc] musi stać w tym samym końcu. Ponieważ każda zmienna, której wcześniej nie używaliśmy, może zostać wypełniona śmieciami, jeśli ustawimy ją po [super dealloc] To rzadka rzecz, ale jest to możliwe. Potem nastąpi awaria naszej aplikacji.Kiedy należy dzwonić super?

A więc jakie jest najlepsze użycie metody super, na przykład, co jest najlepsze w przypadku -(void)viewWillAppear:(BOOL)animated. Gdzie jest najlepsze miejsce na [super viewWillAppear:(BOOL)animated] na początku ciała lub na końcu?

Odpowiedz

50

Zwykłą regułą jest to, że gdy nadpisujesz metodę, która inicjuje, najpierw dzwoń super, a potem rób swoje. A kiedy przesłonić jakiś sposób teardown, zadzwonić Super ostatnia:

- (void) setupSomething { 
    [super setupSomething]; 
    … 
} 

- (void) tearDownSomething { 
    … 
    [super tearDownSomething]; 
} 

Pierwszym rodzajem są podobne metody init…, viewWillAppear, viewDidLoad lub setUp. Drugim są takie rzeczy jak dealloc, viewDidUnload, viewWillDisappear lub tearDown. Nie jest to żadna trudna zasada, tylko wynika z tego, co robią metody.

+1

Dzięki, jest to zasada dobrej praktyki. –

+1

również warto zauważyć, że pod ** ARC ** w ogóle nie trzeba wywoływać '[super dealera]' w implementacji 'dealloc' –

+3

Nie jest to nawet możliwe, kompilator spankuje, jeśli to zrobisz. – zoul

3

To zależy głównie od tego, czy podklasa potrzebuje rzeczy się wydarzy, zanim metody nadklasy, lub po. Lub w obu przypadkach, w zależności od przypadku.

Dlatego metody startowe nazwać super metoda pierwsza rzecz, a metody dealloc Ostatnią rzeczą. W twoim przykładzie, gdy otrzymujesz powiadomienie, że pojawi się widok, możesz chcieć pozwolić supermu zrobić to, a następnie, po tym, zająć się tym, co twój widok podklasy musi zrobić. Ale może być inaczej, albo możesz wywołać super metodę pomiędzy twoim kodem. W zależności od potrzeb twojej aplikacji będą obowiązywały różne zasady.

15

Wystarczy sprawdzić odpowiednie dokumentacje. Na przykład, kiedy wywołanie super w przesłoniętych metody UIViewController:

didReceiveMemoryWarning: Można przesłonić tej metody (w razie potrzeby) do uwolnienia dodatkowej pamięci używanej przez kontrolera widoku. Jeśli tak, być , aby zadzwonić dowdrożenia realizacji w pewnym momencie, aby umożliwić kontroler widoku zwolnić swój widok. [Środki kolejność nie ma znaczenia.]

loadview: niestandardowego wdrożenia tej metody nie powinno nazywać super-.

setEditing: animowane: Ta metoda powinien powołać Super „s wdrażania przed aktualizacją swój pogląd. [Znaczy kolejność ma znaczenie.]

viewWillAppear, viewDidAppear, viewWillDisappear, viewDidDisappear: Jeśli przesłonić tej metody, musisz wezwanie Super w pewnym momencie w implementacji . [Środki kolejność nie ma znaczenia.]

dealloc: W przypadku zastosowania tej metody ale budują swoją aplikację dla iOS 2.x, metoda dealloc powinny zwolnić każdy obiekt, ale powinien również ustaw odwołanie do tego obiektu na nil przed wywołaniem super. [Środki kolejność ma znaczenie.]

Czy zdajesz sobie sprawę, podobne zasady dla Super w viewDidLoad i viewDidUnload metod nie są wymienione? Ponieważ nie musisz w tym celu wywoływać super.

+1

Słowo ostrzeżenia: Trzeba być ostrożnym, gdy mamy do czynienia z głębszą hierarchią. Jeśli A dziedziczy z UIVIewController i nadpisuje viewDidLoad, a B dziedziczy z A, a także nadpisuje viewDidLoad, może to oznaczać, że wysyłanie [super viewDidLoad] w implementacji B jest obowiązkowe. Jak powiedział Comptrol, dokumentacja A powinna to wyraźnie opisać, a programista wdrażający B powinien przeczytać dokumentację A. –

Powiązane problemy