const vs. static NSStrings in Objective-C
Diese Linien sind beide in der Umsetzung-Datei über den @implementation
Erklärung.
NSString * const aVar = @"aVarStringValue";
static NSString *aVar = @"aVarStringValue";
Soweit ich das verstehe, der zweite static
zugeordnet ist, nur einmal innerhalb der Lebensdauer der Anwendung, und diese Tatsache trägt zu der Leistung.
Heißt das aber im Grunde ist es ein memory-leak zu sehen, wie der block von Speicher wird nie freigegeben werden?
Und hat die ersten const
Erklärung zugeteilt jedes mal, wenn es aufgerufen wird Gegensatz?
InformationsquelleAutor firstresponder | 2009-11-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
static
Schlüsselwort in Objective-C (und C/C++) zeigt die Sichtbarkeit der Variablen. Eine statische variable (nicht in einer Methode) kann nur zugegriffen werden, die innerhalb der jeweiligen.m
- Datei. Eine statische lokale variable auf der anderen Seite, reserviert ruft nur einmal.const
auf der anderen Seite, zeigt, dass die Referenz kann nicht geändert werden und/oder neu zugewiesen; und ist orthogonal, wie er erstellt werden kann (Compiler kann optimieren, consts).Es ist erwähnenswert, dass
NSString
Literale bekommen initialisiert und nie zerstört das Leben der Anwendung. Sie zugewiesen sind, die in einem nur-lese-Teil des Speichers.Ich von Ihnen positiv bewertet werden notnoop die Antwort... es ist ein guter. 🙂
Keine bbum nicht? notnoop antwortete ein ganzer Tag vor bbum (EST, sowieso. Er antwortete eine minute früher am selben Tag in anderen Zeitzonen.)
Jede Bezugnahme Quelle für diese Antwort?
InformationsquelleAutor notnoop
Den statische nur änderungen, die den Bereich der Variablen, nicht, wie es erklärt wird, oder gespeichert.
In beiden Fällen erstellt der compiler eine Konstante version der NSString-Instanz gespeichert ist, in das mach-o-Datei. So, es ist immer nur eine Instanz von (beachten Sie, dass Sie zu einer Veränderung des Verhaltens zu bewirken, dass der string, der dynamisch erstellt Auslastung der mach-o -, aber es ist immer noch nur ein Beispiel).
Den
static
ist einfach markiert dieaVar
variable als sichtbar im Rahmen der compilation unit -- die Datei -- nur. Ohne diestatic
könnten Sie deklarieren die Zeichenfolge alsextern NSString *aVar;
im header irgendwo und haben Zugang, um es von überall.Den
const
ist orthogonal und im Fall von NSString Referenz ist so ziemlich völlig irrelevant.Tatsächlich ist die
const
ist nicht ganz spielen keine Rolle-es verhindert, dass Sie ändernaVar
auf eine andere NSString-Objekt.Eigentlich
static
auch zeigen, wie die variable gespeichert ist. Es steht die gesamte Lebensdauer des Programms.InformationsquelleAutor bbum
Um zu lösen alle möglichen Diskussionen über Notwendigkeit
static
und position derconst
:Laut C99/GNU99-Spezifikation (die in der Regel verwendet für Objective-C-code):
static
ist-storage-class-specifier
Objekte, die von Datei-Ebene scope standardmäßig hat externe Verknüpfung
const
ist Typ-Qualifizierer (ist ein Teil des Typs)
Schlüsselwort angewendet zum sofortigen verlassen Instanz - d.h.
MyObj const * myVar;
- unqualifizierte Zeiger auf const-qualifizierten Objekt-TypMyObj * const myVar;
- const-qualifizierten Zeiger auf unvollständigen Objekt-TypLeftmost-Nutzung angewendet werden, um den Objekt-Typ, keine variable
const MyObj * myVar;
- unqualifizierte Zeiger auf const-qualifizierten Objekt-TypSO:
static NSString * const myVar;
- konstanter Zeiger auf unveränderliche string mit innenliegendem Gestänge.Abwesenheit des
static
Schlüsselwort wird die variable name global und könnte dazu führen, dass es zu Namenskonflikten in der Applikation.NSMutableArray * const myArray = [NSMutableArray new];
. Ich habe noch nie verwendetconst
für, und jetzt bin ich verwirrt, wenn ich etwas falsch gemacht die ganze Zeit ??Beachten Sie, dass dies ist nur true, wenn das static in einem globalen file-level-Kontext. Im Körper der Methode, die Bedeutung ist völlig unterschiedlich, und bedeutet, dass der Speicher reserviert wird, sobald im Datenteil der Datei, anstatt gespeichert werden auf dem stack oder heap, und gemeinsam aufrufen der Methode.
InformationsquelleAutor Alexey Pelekh