#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. Полезно и для одноэлементных макросов.