Статический конструктор эквивалентен в Objective-C? - PullRequest
70 голосов
/ 14 июня 2009

Я новичок в Objective C и не смог выяснить, есть ли в языке эквивалент статического конструктора, то есть статического метода в классе, который будет автоматически вызываться перед первым экземпляром такого класса создается. Или мне нужно самому вызывать код инициализации?

Спасибо

Ответы [ 3 ]

128 голосов
/ 14 июня 2009

Метод +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

51 голосов
/ 14 июня 2009

Существует метод класса + initialize , который будет вызван перед использованием класса.

10 голосов
/ 05 января 2012

Небольшое дополнение к этой теме:

Существует еще один способ создания «статического конструктора» в 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.
}
...