У Objective-C, у чому різниця між init
методом (тобто призначеним ініціалізатором для класу) та initialize
методом? Який код ініціалізації слід ввести в кожну?
Відповіді:
-init
є методом екземпляра, що використовується для ініціалізації певного об'єкта. +initialize
є методом класу, що виконується до створення будь-яких екземплярів класу та перед запуском інших методів класу. +initialize
це не те, що ви використовуєте більшу частину часу, але це зручно для налаштування будь-яких статичних змінних, які може використовувати клас у цілому, або для забезпечення дотримання певних умов перед створенням будь-яких екземплярів.
Код , який належить в -init
способі описаний детально в розділі Реалізація ініціалізатор розділ The Objective-C мову програмування . Також є деяке обговорення ініціалізації класів (тобто +initialize
) та того, чому вам може знадобитися це зробити в тому ж документі, у розділі Об’єкти класу . Код, який входить +initialize
, як правило, буде міцно пов’язаний зі спеціальною функціональністю класу, який вимагає від вас ініціалізації в першу чергу. Важливо пам’ятати +initialize
(і в будь-якому методі класу), що self
метод класу стосується самого класу, а не екземпляра класу.
if (self == [NameOfClass class])
внутрішній +initialize
метод, чому нам це потрібно перевіряти? Я знаю, що це пов’язано з тим, що +initialize
метод двічі викликається у батьківському класі, але для мене це не зрозуміло. Будь-яка допомога оцінена!
+initialize
вона викликається лише один раз для класу, одну реалізацію можна викликати кілька разів - один раз для класу, в якому він знаходиться, і один раз для кожного підкласу, який не забезпечує власний +initialize
метод.
Щоб провести паралель для розробників Java, init схожий на конструктор, тоді як ініціалізація - як статичний блок класу.
+initialize
методу). Ви можете фактично створити екземпляр класу, не надсилаючи цьому класу повідомлення (за допомогоюIMP
методу of it create-instance (зазвичай,+allocWithZone:
але це може відрізнятися)).