Objective-C: init проти ініціалізації


74

У Objective-C, у чому різниця між initметодом (тобто призначеним ініціалізатором для класу) та initializeметодом? Який код ініціалізації слід ввести в кожну?

Відповіді:


126

-initє методом екземпляра, що використовується для ініціалізації певного об'єкта. +initializeє методом класу, що виконується до створення будь-яких екземплярів класу та перед запуском інших методів класу. +initializeце не те, що ви використовуєте більшу частину часу, але це зручно для налаштування будь-яких статичних змінних, які може використовувати клас у цілому, або для забезпечення дотримання певних умов перед створенням будь-яких екземплярів.

Код , який належить в -initспособі описаний детально в розділі Реалізація ініціалізатор розділ The Objective-C мову програмування . Також є деяке обговорення ініціалізації класів (тобто +initialize) та того, чому вам може знадобитися це зробити в тому ж документі, у розділі Об’єкти класу . Код, який входить +initialize, як правило, буде міцно пов’язаний зі спеціальною функціональністю класу, який вимагає від вас ініціалізації в першу чергу. Важливо пам’ятати +initialize(і в будь-якому методі класу), що selfметод класу стосується самого класу, а не екземпляра класу.


12
"запустити до створення будь-яких екземплярів класу" насправді: надіслано до того, як цей клас отримає своє перше повідомлення (за винятком +initializeметоду). Ви можете фактично створити екземпляр класу, не надсилаючи цьому класу повідомлення (за допомогою IMPметоду of it create-instance (зазвичай, +allocWithZone:але це може відрізнятися)).

11
@WTP, справедливий момент, але якщо ви працюєте в цьому просторі, ви, мабуть, досить чітко розрізняєте + ініціалізувати та -init.
Калеб,

4
Я зазвичай бачу if (self == [NameOfClass class])внутрішній +initializeметод, чому нам це потрібно перевіряти? Я знаю, що це пов’язано з тим, що +initializeметод двічі викликається у батьківському класі, але для мене це не зрозуміло. Будь-яка допомога оцінена!
makaed

3
@makaed На ваше запитання добре відповіли в документації - ось відповідний рядок: Реалізація суперкласу може бути викликана кілька разів, якщо підкласи не реалізують ініціалізацію - час виконання викликатиме успадковану реалізацію ... Отже, навіть якщо +initializeвона викликається лише один раз для класу, одну реалізацію можна викликати кілька разів - один раз для класу, в якому він знаходиться, і один раз для кожного підкласу, який не забезпечує власний +initializeметод.
Калеб,

1
Ах, спасибі! Тепер це має сенс. Я також створив запитання і мав кілька хороших відповідей.
makaed

18

Щоб провести паралель для розробників Java, init схожий на конструктор, тоді як ініціалізація - як статичний блок класу.


3
Чудове пояснення! Дуже дякую!
Сактімутія
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.