Как я создаю NSArray со строковыми литералами?

Я пытаюсь создать NSArray с группировкой строковых литералов, однако я добираюсь, ошибка компиляции "Элемент инициализатора не является постоянной".

NSArray *currencies = [NSArray arrayWithObjects:@"Dollar", @"Euro", @"Pound", nil];

Кто-то мог указать на то, что я делаю неправильно и возможно объясняю сообщение об ошибке?

30
задан Kyle 6 May 2010 в 16:48
поделиться

4 ответа

Это проблема не с самим созданием NSArray (вы получите ту же ошибку, если напишете [NSArray array] вместо этого), а с тем, куда вы его записали. Я предполагаю, что это глобальный или файлово-статический NSArray. В языке C переменная такого типа должна иметь постоянный инициализатор - то есть не вызов функции (или, в крайнем случае, вызов метода). Решение состоит в том, чтобы поместить фактическое создание и присвоение массива в метод, который будет вызван до того, как вам понадобится массив, например initialize.

18
ответ дан 27 November 2019 в 23:06
поделиться

В этом коде нет ничего плохого. Вы уверены, что ошибка возникает в этой строке?

0
ответ дан 27 November 2019 в 23:06
поделиться

Похоже, Чак заметил проблему. Однако при кодировании вашего решения вы должны помнить об одной вещи: вы захотите избежать хранения автоматически освобождаемого экземпляра NSArray в статической переменной. Кроме того, обычным шаблоном для таких ситуаций является написание метода класса, который создает и возвращает значение, хранящееся в статической переменной, примерно так:

+ (NSArray *)currencies
{
    static NSArray *_currencies;

    // This will only be true the first time the method is called...
    //
    if (_currencies == nil)
    {
        _currencies = [[NSArray alloc] initWithObjects:@"Dollar", @"Euro", @"Pound", nil];
    }

    return _currencies;
}
7
ответ дан 27 November 2019 в 23:06
поделиться

Я новичок в objective-c, но думаю, что правильный код такой:

NSArray *currencies = [[NSArray alloc] initWithObjects:@"Dollar", @"Euro", @"Pound", nil];

Я не уверен.

2
ответ дан 27 November 2019 в 23:06
поделиться