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