Инициализация Objective-C (статический метод) вызывается более одного раза? - PullRequest
7 голосов
/ 12 октября 2010

У меня есть код, подобный этому в Objective-C:

SubclassOfNSObject *GlobalVariableThatShouldNeverChange;

@implementation MyClass

+(void) initialize
{
    [super initialize];
    GlobalVariableThatShouldNeverChange = [[SubclassOfNSObject alloc] init];
    // Change more stuff with GlobalVariableThatShouldNeverChange
}

@end

Я ссылаюсь на это во всем коде, и указатель на него никогда не должен изменяться, потому что я использую его везде через мой код. Проблема в том, что когда я запускаю свои тесты, используя GHUnit, у меня возникают странные проблемы с изменением указателя GlobalVariableThatShouldNeverChange (т.е. он переинициализируется. У меня была проблема с выпуском переменной через пул авто-выпуска это исправлено, и у меня есть обходной путь для этой проблемы, но я хотел бы знать почему ?

Спасибо!

Ответы [ 3 ]

16 голосов
/ 12 октября 2010

документы говорят:

Среда выполнения отправляет инициализацию каждому классу в программе ровно один раз непосредственно перед классом, или любому классу, который наследует от него .

Рекомендуемый подход:

+ (void)initialize
{
    if (self == [GHUnit class]) {

        /* put initialization code here */

    }
}

Также обратите внимание на следующую рекомендацию из документации:

& hellip; как правило, вы не должны отправлять initialize на super в вашей реализации.

6 голосов
/ 12 октября 2010

Короткий ответ - да, +initialize можно вызывать более одного раза.

Билл Бамгарнер написал хорошую статью в своем блоге об этом.См. + initialize Может быть выполнен несколько раз (+ загрузка не так много)

2 голосов
/ 18 января 2012

Чтобы сложить ответ на dreamlax: остерегайтесь того, что у вас могут быть подклассы без их явного создания, т. Е. Если вы используете KVO, подкласс будет создан на лету (который, в свою очередь, снова вызовет инициализацию), и все ваши экземпляры меняются на этот самый класс.

...