2010-11-03 7 views
6

Jeśli nie chcemy implementować metody init w naszej klasie i mając na uwadze, że init w NSObject zwraca tylko instancję obiektu bez inicjalizacji, nie widzę punktu wywoływania init, jeśli już otrzymamy instancję z przydziałem. Próbowałem i działa, ale nie jestem pewien, czy nie spowoduje to przyszłych problemów.Czy to byłoby poprawne/ellegant używać tylko przydzielić bez init?

myClass *newObject = [myClass alloc]; 

zamiast:

myClass *newObject = [[myClass alloc] init]; 

dzięki.

Odpowiedz

16

Nie, samo wywołanie alloc nie będzie poprawne. alloc zeruje wszystkie zmienne instancji obiektu, init, a następnie ma szansę ustawić wszystkie lub niektóre zmienne instancji na ich wartości domyślne. Niektóre klasy nawet używają swoich metod, aby stworzyć inną instancję i zwrócić ją zamiast tej, którą przydzielono.

Wiele klas oczekuje, że ich metody init zostaną wywołane i prawdopodobnie spowoduje awarie, jeśli nie zadzwonisz pod numer init. Jeśli mówisz o klasie niestandardowej, która dziedziczy bezpośrednio od NSObject i nie wymaga inicjalizacji zmiennych instancji, możesz uciec z [myClass alloc], ale zdecydowanie nie jest to dobry styl programowania.

+0

Wielkie dzięki za wyjaśnienie. "Jeśli mówisz o klasie niestandardowej, która dziedziczy bezpośrednio z NSObject i nie wymaga inicjalizacji zmiennych instancji, możesz uciec z [przydziałem myClass], ale zdecydowanie nie jest to dobry styl programowania." Tak było w moim przypadku. Odpowiedź została zaakceptowana. – toupper

+2

@toupper: Warto wspomnieć, że jeśli chcesz krótszej składni, możesz zrobić "[myClass new];" co jest równoznaczne z '[[myClass alloc] init];', ale nie można go uznać za modne . –

2

Myślę, że to nie jest dobry pomysł.
Czytaj Cocoa Pattern Design, zwłaszcza „tworzenie Dwustopniowy”

Można też przeczytać ten artykuł http://www.informit.com/articles/article.aspx?p=1398610

+0

Wielkie dzięki, użyteczne informacje. – toupper

+0

Nie do końca rozumiem: "Wzór kakao - tworzenie dwuetapowe": twierdzi, że tworzenie dwóch etapów jest lepsze, ponieważ unika eksplozji "konstruktorów/metod klasowych/metod fabrykacji", ale w porównaniu do java, nie [[Foo alloc] init] taki sam jak Foo f = new Foo(); f.init() ;? –

0

myślę, że to nie ma większego znaczenia, jeśli nie realizować „- (id) init ", ponieważ gdyby tak było, wywołasz metodę init NSObject, która po prostu zwraca tę samą wartość, którą wysyłasz do metody. Chociaż dobrze jest utworzyć własną metodę init, aby ustawić zmienną instancji.

Powiązane problemy