In Objective-C, gli oggetti possono essere allocati solo in heap, quindi non c'è modo di creare un NSArray nella memoria statica. Tuttavia, è possibile creare una serie C di puntatori a costanti NSString in questo modo ...
NSString * const kLabelNames[] = {
@"Foo", @"Bar", @"Baz"
};
... e quindi è possibile scrivere i metodi della classe come questo ...
+ (NSArray *)labelNames
{
static NSArray *names;
if (names == nil) {
names = [[NSArray alloc] initWithObjects:kLabelNames count:3];
}
return names;
}
Edit
Si noti che con l'introduzione di nuove tecnologie come ARC, Grand Central Dispatch e la nuova sintassi letterale per gli array, ora c'è un modo più semplice per realizzare qualcosa di simile. Si noti che l'esempio di seguito fornisce anche una maggiore sicurezza del thread, sebbene l'esempio originale possa aver incorporato un blocco @synchronized
o uno dei numerosi altri meccanismi, per ottenere risultati simili.
+ (NSArray *)labelNames
{
static NSArray *names;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
names = @[@"Foo", @"Bar", @"Baz"];
});
return names;
}
Tuttavia, l'esempio sopra riportato non risolve completamente la domanda originale. Se veramente è necessario un allineamento costante globale, l'esempio precedente potrebbe essere riscritto in modo analogo come la risposta originale, pur sfruttando 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;
}
possibile duplicato di [Come dichiaro un array come una costante in Objective-C?] (Http://stackoverflow.com/questions/2436463/how-do-i-declare-an-array- as-a-constant-in-objective-c) –