В Objective-C объекты могут размещаться только в куче, поэтому нет способа создать NSArray в статической памяти. Тем не менее, вы можете создать массив C указателей на константы NSString, например так ...
NSString * const kLabelNames[] = {
@"Foo", @"Bar", @"Baz"
};
... и тогда вы можете написать методы класса, подобные этому ...
+ (NSArray *)labelNames
{
static NSArray *names;
if (names == nil) {
names = [[NSArray alloc] initWithObjects:kLabelNames count:3];
}
return names;
}
Редактировать
Обратите внимание, что с появлением новых технологий, таких как ARC, Grand Central Dispatch и нового буквального синтаксиса для массивов, теперь есть более простой способ сделать что-то подобное. Обратите внимание, что приведенный ниже пример также обеспечивает большую безопасность потоков, хотя исходный пример мог включать в себя блок @synchronized
или один из нескольких других механизмов для достижения аналогичных результатов.
+ (NSArray *)labelNames
{
static NSArray *names;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
names = @[@"Foo", @"Bar", @"Baz"];
});
return names;
}
Однако приведенный выше пример не полностью отвечает первоначальному вопросу. Если глобальный константный массив действительно необходим, предыдущий пример может быть переписан в том же ключе, что и исходный ответ, при этом все еще используя GCD:
NSString * const kLabelNames[] = {
@"Foo", @"Bar", @"Baz"
};
+ (NSArray *)labelNames
{
static NSArray *names;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
names = [NSArray arrayWithObjects:kLabelNames count:3];
});
return names;
}