Статический конструктор эквивалентен в Objective-C?
Я новичок в Objective C, и я не смог выяснить, есть ли в языке эквивалент статического конструктора, то есть статического метода в классе, который будет автоматически вызываться перед первым экземпляром такого класса создается экземпляр. Или мне нужно самому вызывать код инициализации?
Спасибо
3 ответа
+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 для каждого класса, мы хотим проверить равенство с ==
оператор. Вы можете использовать это, чтобы отфильтровать то, что должно происходить только один раз, а не один раз для каждого отдельного класса в иерархии (которая может еще не существовать) ниже данного класса.
По касательной теме стоит узнать о следующих связанных методах, если вы еще этого не сделали:
- - isMemberOfClass: (Class) aClass (true только для
aClass
сам) - - isKindOfClass: (Class) aClass (true для
aClass
и дети) - + isSubclassOfClass: (Class) 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
Существует метод класса +initialize, который будет вызван перед использованием класса.
Немного дополнения к этой теме:
Есть еще один способ создать "статический конструктор" в obj-c, используя __attribute
директива:
// prototype
void myStaticInitMethod(void);
__attribute__((constructor))
void myStaticInitMethod()
{
// code here will be called as soon as the binary is loaded into memory
// before any other code has a chance to call +initialize.
// useful for a situation where you have a struct that must be
// initialized before any calls are made to the class,
// as they would be used as parameters to the constructors.
// e.g.
myStructDef.myVariable1 = "some C string";
myStructDef.myFlag1 = TRUE;
// so when the user calls the code [MyClass createClassFromStruct:myStructDef],
// myStructDef is not junk values.
}