Подтвердить что ты не робот

"Элемент инициализатора не является константой времени компиляции", почему?

У меня есть этот код:

- (NSString *) calculate: (uint) position {
    static NSArray * localArray = [NSArray arrayWithArray: self.container.objects ];
    // some un related code
    return obj;
}

Компилятор жалуется на высказывание: "Элемент Initializer не является константой времени компиляции". Это произошло, когда я добавил "static" в localArray. Но почему?

4b9b3361

Ответ 1

Поскольку [NSArray arrayWithArray: self.container.objects ] не является константой времени компиляции, это выражение, которое должно оцениваться во время выполнения. В C и Objective-C переменные внутри функций должны быть инициализированы с помощью констант времени компиляции, тогда как С++ и Objective-C ++ являются более снисходительными и допускают постоянные константы без компиляции.

Скомпилируйте свой код как Objective-C ++ или переформатируйте его таким образом:

static NSArray *localArray = nil;
if (localArray == nil)
    localArray = [NSArray arrayWithArray: self.container.objects ];

Что довольно похоже на код, который компилятор будет генерировать под капотом для переменной static, инициализированной постоянной константой компиляции, в любом случае (на самом деле он использовал бы второй глобальный флаг, указывающий, было ли это значение инициализируется, а не использует значение дозорного значения, например nil здесь, в этом случае мы предполагаем, что localArray никогда не будет nil). Вы можете проверить свою разборку компилятора для этого, если хотите.

Ответ 2

Вы просто не можете инициализировать статическую переменную с нестатическим значением, которое будет известно/изменено во время выполнения.

Вероятно, вы должны сделать что-то вроде этого:

static NSArray *localArray = nil;
localArray = ...;

Первая инструкция будет выполняться один раз в жизненном цикле вашего приложения. Вторая команда будет выполняться каждый раз, когда вызывается метод вычисления:

Тем не менее, обратите внимание на то, что использование статических переменных может привести к ошибочному поведению, если это не сделано правильно, поэтому, если вы чувствуете себя неловко с ними, вы, вероятно, не должны их использовать.