Как заполнить NSArray const? (включен нерабочий код)

#iphone #objective-c #nsarray #constants

#iPhone #objective-c #nsarray #константы

Вопрос:

Как заполнить NSArray const? Или, в более общем смысле, как я могу исправить приведенный ниже код, чтобы в нем была константа массива (созданная в Constants.h amp; Constants.m) должны быть доступны для других частей моего кода.

Надеялся получить доступ к константе как к объекту статического типа (т. Е. в отличие от необходимости создавать экземпляр constants.m и затем обращаться к нему), возможно ли это.

Я отмечаю, что подход работает нормально для строки, но для NSArray проблема заключается в заполнении массива.

Код:

constants.h

 @interface Constants : NSObject {
}
extern NSArray  * const ArrayTest;
@end
  

#импортировать «Constants.h»

     @implementation Constants

    NSArray  * const ArrayTest = [[[NSArray alloc] initWithObjects:@"SUN", @"MON", @"TUES", @"WED", @"THUR", @"FRI", @"SAT", nil] autorelease];   
    // ERROR - Initializer element is not a compile time constant

    @end
  

Ответ №1:

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

Простой пример решения заключается в следующем:

 /* Interface */
  (NSArray *)someValues;

/* Implementation */
  (NSArray *)someValues
{
    static NSArray *sSomeValues;
    if (!sSomeValues) {
        sSomeValues = [[NSArray alloc]
                       initWithObjects:/*objects*/, (void *)nil];
    }
    return sSomeValues;
}
  

Вы, конечно, можете придумать это с помощью GCD вместо использования if:

 /* Implementation */
  (NSArray *)someValues
{
    static NSArray *sSomeValues;
    static dispatch_once_t sInitSomeValues;
    dispatch_once(amp;sInitSomeValues, ^{
        sSomeValues = [[NSArray alloc]
                       initWithObjects:/*objects*/, (void *)nil];
    });
    return sSomeValues;
}
  

Комментарии:

1. Хорошая реализация GCD. Полезно и для одноэлементных макросов.