In Objective-C können Objekte nur im Heap zugewiesen werden, daher gibt es keine Möglichkeit, ein NSArray im statischen Speicher zu erstellen. Allerdings können Sie ein C-Array von Zeigern auf NSString-Konstanten wie folgt erstellen...
NSString * const kLabelNames[] = {
@"Foo", @"Bar", @"Baz"
};
...und dann kann man Klassenmethoden wie diese schreiben...
+ (NSArray *)labelNames
{
static NSArray *names;
if (names == nil) {
names = [[NSArray alloc] initWithObjects:kLabelNames count:3];
}
return names;
}
Editar
Beachten Sie, dass es mit der Einführung neuer Technologien wie ARC, Grand Central Dispatch und der neuen Literal-Syntax für Arrays nun einen einfacheren Weg gibt, etwas Ähnliches zu erreichen. Beachten Sie, dass das folgende Beispiel auch eine größere Thread-Sicherheit bietet, obwohl das ursprüngliche Beispiel eine @synchronized
Block oder einen der anderen Mechanismen, um ähnliche Ergebnisse zu erzielen.
+ (NSArray *)labelNames
{
static NSArray *names;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
names = @[@"Foo", @"Bar", @"Baz"];
});
return names;
}
Das obige Beispiel beantwortet die ursprüngliche Frage jedoch nicht vollständig. Wenn ein globales Konstanten-Array wirklich benötigt wird, könnte das vorangegangene Beispiel ähnlich wie die ursprüngliche Antwort umgeschrieben werden, wobei immer noch die Vorteile von GCD genutzt werden:
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;
}
0 Stimmen
Mögliche Duplikate von Wie deklariere ich ein Array als eine Konstante in Objective-C?