En Objective-C, los objetos solo se pueden asignar en el montón, por lo que no hay forma de crear un NSArray en la memoria estática. Sin embargo, puede crear una matriz C de punteros a constantes NSString como así ...
NSString * const kLabelNames[] = {
@"Foo", @"Bar", @"Baz"
};
... y entonces se puede escribir métodos de clase como ésta ...
+ (NSArray *)labelNames
{
static NSArray *names;
if (names == nil) {
names = [[NSArray alloc] initWithObjects:kLabelNames count:3];
}
return names;
}
Editar
Tenga en cuenta que con la introducción de nuevas tecnologías como ARC, Grand Central Dispatch y la nueva sintaxis literal para matrices, ahora hay una forma más directa de lograr algo similar. Tenga en cuenta que el ejemplo a continuación también proporciona mayor seguridad de subprocesos, aunque el ejemplo original podría haber incorporado un bloque @synchronized
, o uno de varios otros mecanismos, para lograr resultados similares.
+ (NSArray *)labelNames
{
static NSArray *names;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
names = @[@"Foo", @"Bar", @"Baz"];
});
return names;
}
Sin embargo, el ejemplo anterior no aborda por completo la pregunta original. Si realmente se necesita una matriz constante global, el ejemplo anterior se podría reescribir lo largo de líneas similares a la respuesta original, sin dejar de tomar ventaja de 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;
}
posible duplicado de [¿Cómo declaro una matriz como una constante en Objective-c?] (Http://stackoverflow.com/questions/2436463/how-do-i-declare-an-array- as-a-constant-in-objective-c) –