Цель C: Инициализация статической переменной с помощью вызова статического метода - PullRequest
2 голосов
/ 11 мая 2010

Компилятор сообщает об ошибке, говорящей: «элемент инициализатора не является константой», когда я пытаюсь инициализировать статическую переменную внутри метода с помощью вызова статического метода (с + в его определении). В любом случае, я могу сказать ему, что этот метод всегда возвращает одно и то же значение. Я знаю, что это не то же самое, что статический метод, но в Objective-C, похоже, нет постоянных методов (кроме макросов, которые не будут работать здесь, потому что я вызываю UI_USER_INTERFACE_IDIOM () изнутри метода).

Ответы [ 2 ]

4 голосов
/ 11 мая 2010

Есть еще одно решение в дополнение к Юджи. Вы можете создать функцию и добавить к ней префикс с помощью атрибута GCC (также работает в Clang и LLVM), который будет выполнять ее раньше, чем main(). Я использовал этот подход несколько раз, и он выглядит примерно так:

static NSString *foo;

__attribute__((constructor)) initializeFoo() {
    foo = ...;
}

Когда вы на самом деле используете foo, он уже будет инициализирован. Это означает, что вам не нужно проверять, является ли он nil каждый раз. (Это, безусловно, незначительное преимущество в производительности, хотя и умноженное на количество раз его использования, но оно также может упростить одну или несколько других областей кода. Например, если вы ссылаетесь на статическую переменную в N разных местах, вы можете проверить на nil во всех буквах N или рискнуть сбой. Часто люди вызывают функцию или используют #define для обработки инициализации, и если этот код используется только один раз, это может быть штрафом за удаление.

1 голос
/ 11 мая 2010

Вы не можете сделать это в Objective-C.

Существует два решения:

  1. Переключиться на Objective-C ++. Измените расширение файла с .m на .mm.
  2. Инициализируйте его с помощью nil и проверяйте его при первом использовании, как в:

    static NSString*foo=nil;
    if(!foo){
          foo=[ ... ] ;
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...