Статический конструктор эквивалентен в Objective-C?


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

спасибо

3 69

3 ответа:

The +initialize метод называется автоматически при первом использовании класса перед использованием методов класса или созданием экземпляров. Вы никогда не должны звонить +initialize себя.

я также хотел передать лакомый кусочек, который я узнал, что может укусить вас по дороге:+initialize наследуется подклассами, а также вызывается для каждого подкласса, который не реализует +initialize собственных. Это может быть особенно проблематично, если вы наивно реализуете одноэлементную инициализацию в +initialize. Решение состоит в том, чтобы проверить тип переменной класса следующим образом:

+ (void) initialize {
  if (self == [MyParentClass class]) {
    // Once-only initializion
  }
  // Initialization for this class and any subclasses
}

все классы, которые происходят от NSObject имеют оба +class и -class методы, которые возвращают )

  • - isKindOfClass: (Class)aClass (правда для aClass и детей)
  • + isSubclassOfClass: (класс)aClass (то же, что и выше, но класс метод)

  • Edit: проверьте этот пост по @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

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

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

    есть еще один способ создать "статический конструктор" в obj-c, используя