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ą.
Brzmi świetnie, ale '-initWithCoder:' nie jest wywoływany na UIViewControllers. – CodaFi
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
tak czy inaczej, podczas ładowania z storyboardu uzyskujesz również "-awakeFromNib". – jackslash