Zazwyczaj, gdy podklasę klasy UI
będę wywoływał zainicjalizowany klasy nadklasy. Jednak nie jestem pewien szczegóły implementacji NSObject
i wydaje się, że nie ma wiele dzieje się w kategoriach vars członkowskich, więc zastanawiam się: czy muszę wywołać [super init]
, jeśli moja podklasa rozszerza NSObject
?Czy muszę wywołać [super init] lub [super initWithCoder], itp. Dla NSObject
Odpowiedz
Technicznie nie. documentation for -[NSObject init]
mówi, że
Sposób
init
zdefiniowane w klasieNSObject
robi żadnej inicjalizacji; po prostu zwracaself
.
Bo to jest udokumentowane i nie ma chyba już grono kodu, który polega na tym, że faktem jest, wysoce raczej się nie zmieni w przyszłych wersjach systemu Mac OS X.
Edit:BoltClock's a Unicorn przynosi do punktu, który chciałbym uczynić bardziej hiperbolicznym: całkowity czas zaoszczędzony przez niewywołanie -[NSObject init]
dla każdego, kto kiedykolwiek uruchomił twój program, nigdy nie przekroczy czasu debugowania, który ponosisz, jeśli kiedykolwiek zmienisz klasę nadrzędną dla twojej klasy na coś inny niż NSObject
i zapomnij dodać połączenie pod numer [super init]
.
Z documentation, to nie wydaje się, aby wykonywać żadnej inicjalizacji w ogóle:
Sposób
init
zdefiniowane w klasie NSObject robi żadnej inicjalizacji; po prostu zwracaself
.
Przypuszczam byłoby nieszkodliwe nie zadzwonić [super init]
, ale nie ma powodu, aby nie podążać konwencje i, wiesz, nazywają go w swojej podklasy tak. Na przykład Twoja podklasa może w przyszłości dziedziczyć po innej klasie, która może zawierać logikę inicjalizacji w swojej własnej metodzie -init
, którą będzie wymagać twoja podklasa.
Po prostu zadzwoń przez jeden z inicjatorów oznaczonych super
w swojej implementacji, ponieważ powinieneś zrobić to, co jest jasne i poprawne.