Метод +initialize
вызывается автоматически при первом использовании класса, перед использованием любых методов класса или созданием экземпляров. Никогда не звоните +initialize
.
Я также хотел передать тидбит, который я узнал, который может укусить вас в будущем: +initialize
наследуется подклассами и также вызывается для каждого подкласса, который не реализует +initialize
их собственный . Это может быть особенно проблематично, если вы наивно реализуете одиночную инициализацию в +initialize
. Решением является проверка типа переменной класса следующим образом:
+ (void) initialize {
if (self == [MyParentClass class]) {
// Once-only initializion
}
// Initialization for this class and any subclasses
}
Все классы, которые происходят от NSObject, имеют методы +class
и -class
, которые возвращают объект Class
. Поскольку для каждого класса существует только один объект Class, мы хотим проверить равенство с помощью оператора ==
. Вы можете использовать это, чтобы отфильтровать то, что должно происходить только один раз, а не один раз для каждого отдельного класса в иерархии (которая может еще не существовать) ниже данного класса.
По тангенциальной теме стоит изучить следующие связанные методы, если вы еще этого не сделали:
Редактировать: Проверить это сообщение по @ bbum , который объясняет больше о +initialize
: http://www.friday.com/bbum/2009/09/06/iniailize-can-be-executed-multiple-times-load-not-so-much/
Также Майк Эш написал в пятницу подробные подробные вопросы и ответы о методах +initialize
и +load
:
https://www.mikeash.com/pyblog/friday-qa-2009-05-22-objective-c-class-loading-and-initialization.html