2013-03-19 11 views
30

Mój początkowy kontroler widoku jest załadowany i potrzebuję NSArray do zainicjowania, czy powinienem to zrobić w metodzie awakeFromNib lub initWithCoder:? AwakeFromNib wydaje się działać lepiej, ponieważ nie muszę niczego zwracać, ale działa jak pliki nib, które kiedyś były używane właściwie? Nie chcę używać metody, która wkrótce się złamie.Czy powinienem używać tutaj awakeFromNib lub initWithCoder?

I byłoby initWithCoder: właśnie wygląda:

- (id)initWithCoder:(NSCoder *)decoder { 
    if (self = [super initWithCoder:decoder]) { 
     self.articles = [[NSMutableArray alloc] init]; 
    } 

    return self; 
} 

Odpowiedz

38

Punktem -awakeFromNib jest tak, że można zrobić startowy rzeczy, skoro można mieć pewność, że wszystkie połączenia do innych obiektów w stalówki zostały ustalone.

Infrastruktura stalówka ładowania wysyła wiadomość awakeFromNib każdemu obiektu odtworzone z archiwum stalówki, ale dopiero po wszystkich obiektów w archiwum zostały załadowane i zainicjowany. Gdy obiekt odbiera komunikat o awakeFromNib, jest zagwarantowane, że wszystkie jego połączenia wyjściowe i zostały już ustanowione.

Nie zapomnij zadzwonić pod numer super.

Jest mało prawdopodobne, że zniknie w najbliższym czasie, a jeśli tak wiele kodu używa go, okres przejściowy będzie długi. Tak, nazwa pochodzi od starego formatu pliku "nib", ale this stack overflow question usuwa różnice w rozszerzeniach plików.

Podsumowując, każda metoda będzie działać dla Ciebie podczas ustawiania wewnętrznej instancji zmiennej dla klasy. Zauważ, że w metodach init (w tym -initWithCoder) używanie setterów może nie być bezpieczne, jeśli settery polegają na pełnej inicjalizacji klasy (wideo źródłowe WWDC 2012 przesuwa się do nowoczesnego celu-c). Przykładem byłoby ustawienie właściwości odwołującej się do innego obiektu w pliku nib.

W UIViewController podklasy -initWithCoder są wywoływane tylko podczas ładowania z storyboardu. Ponieważ nazwa -awakeFromNib jest wywoływana niezależnie od tego, czy używasz scenorysów, czy nie, może to mieć więcej sensu.

Kolejny wzór można rozważyć, jest leniwy przebojowa:

-(NSMutableArray *)articles{ 
    if (_articles){ 
     return _articles; 
    } 
    _articles = [[NSMutableArray alloc] init]; 
    return _articles; 
} 

Zaletą tego podejścia jest to, że jeśli chcesz zrobić dalszej konfiguracji do tablicy można łatwo usunąć tablicę kiedy nie już go potrzebuję i następnym razem, gdy uzyskasz dostęp do nieruchomości, znów masz nową.

+1

Brzmi świetnie, ale '-initWithCoder:' nie jest wywoływany na UIViewControllers. – CodaFi

+4

Umieściłem punkt przerwania w metodzie "initWithCoder" podklasy UIViewController, która pobiera instancję z Storyboard, a debugger trafia w punkt przerwania. [Dokumenty] (http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ViewLoadingandUnloading/ViewLoadingandUnloading.html#//apple_ref/doc/uid/TP40007457-CH10) potwierdzają to zachowanie. – Jeff

+0

tak czy inaczej, podczas ładowania z storyboardu uzyskujesz również "-awakeFromNib". – jackslash

Powiązane problemy