2009-05-09 12 views
59

Widzę przykładowy kod z [super viewDidLoad] wywoływane przed twoją implementacją i po twojej implementacji.`[super viewDidLoad]` konwencja

Wiem, że nie zawsze trzeba zadzwonić super (jak widać w wielu innych dyskusjach). Kiedy to się nazywa, czy oczekuje się przed, czy po kodowaniu?

Może to mieć konsekwencje w zależności od tego, co robi implementacja super. Chociaż nie powinieneś znać implementacji super, aby pisać swoje.

Oczywiście dotyczy to wszystkich metod delegata UIViewControllers (willAppear, didAppear, etc ...)

Wszelkie myśli?

+0

związane: http://stackoverflow.com/questions/824695/do-i-always-have-to-call-super-viewdidload-in-the-viewdidload-method – cregox

Odpowiedz

91

Moja zasada brzmi: jeśli robisz coś związanego z inicjalizacją, zawsze najpierw wywołaj metodę super klasy (jeśli w ogóle chcesz ją wywołać). Daje to superklasie możliwość zrobienia jakiejkolwiek konfiguracji, na którą możesz polegać w dalszej części swojej metody. Jeśli robisz coś związanego ze zniszczeniem, odwołaj się do metody super klasy. Dzięki temu można polegać na stanie obiektu podczas wykonywania metody. Wreszcie, weź każdy inny przypadek na podstawie każdego przypadku. Na przykład, jeśli zajmujesz się wydarzeniem, prawdopodobnie chcesz najpierw zająć się zdarzeniem, i powołać się na metodę super-klasy, jeśli zdecydujesz się nie obsługiwać tego wydarzenia lub jeśli w jakiś sposób go zmieniłeś i chcesz przekazać je wraz z wydarzeniem łańcuch.

+7

Dobra rada od Jasona, a często dokumenty firmy Apple odpowiedzialność subklasera, gdy jest ważna. Na przykład. kiedy kluczowe zachowanie zależy od superuczenia, często jest podświetlone w dokumentacji. Ogólnie, jeśli to nie będzie cię bolało, po prostu zadzwoń do super, aby być bezpiecznym. – danielpunkass

+0

Dzięki, to jest całkiem logiczne i rodzaj podejścia, które podejmowałem. Podklajałem własne klasy i miałem wybór co robić. Nie chciałem naruszać konwencji, wymagając ustawienia przed/po viewDidLoad. –

+3

Oczywiście jest to przeciwieństwo w -etalloc, ponieważ może być konieczne użycie czegoś należącego do superklasy, zanim zostanie ona zwolniona. – mk12

0

Powiedzmy, że masz 2 klasy, rodzica i dziecko. Dziecko dziedziczy po rodzicu. Mają metodę o nazwie greet, która zwraca ciąg znaków.

Oto co metoda dominująca wygląda następująco:

Kod:

-(NSString *)greet { 
return @"Hello"; 
} 

Chcemy dziecko uczyć się od swoich rodziców. Używamy więc słowa "super", aby powiedzieć "pozdrawiam" Mamę, ale także z własnymi dodatkami.

Kod: // Dziedziczy z rodzica

-(NSString *)greet { 
NSString *parentGreeting = [super greet]; 
return [parentGreeting stringByAppendingString:@", Mommy"] 
} 

Więc teraz nadrzędna wita "Hello", a dziecko wita "Cześć, mamo". Później, jeśli zmienimy powitanie rodzica, aby powrócić po prostu "Cześć", to wpłynie to na obie klasy, a otrzymasz "Cześć" i "Cześć, Mamo".

super służy do wywołania metody zdefiniowanej przez nadklasę. Służy do uzyskiwania dostępu do metod, które zostały przesłonięte przez podklasy, aby klasa mogła zawijać własny kod wokół metody, którą implementuje klasa nadrzędna. Jest bardzo przydatny, jeśli w ogóle dokonujesz dziedziczenia.

Powiązane problemy