ARC: Wie zu release statische variable?
Wird dealloc
(unten) lösen Sie die NSString
gezeigt, durch die statische variable exampleString
?
//ExampleClass.h
@interface ExampleClass : NSObject
@end
//ExampleClass.m
static NSString *exampleString;
@implementation ExampleClass
- (void)dealloc {
exampleString = nil;
}
- (id)init {
self = [super init];
if (self) {
exampleString = [NSString stringWithFormat:@"example %@", @"format"];
}
return self;
}
@end
- Dies ist ein merkwürdiges Beispiel. Erstens
static
als in Ihrem code verwendet, bedeutet nicht Speicherdauer aber die Sichtbarkeit (Verknüpfung) statt. Zweitens, es sieht aus wie Sie entweder wollen Klassenmethoden im Gegensatz zu Instanzmethoden, oderexampleString
sollte eine Instanz-variable. Was genau wollen Sie erreichen? - du hast Recht. Dies ist ein merkwürdiges Beispiel. Wenn Sie zeigen Sie mir ein besseres Beispiel. Ich bin eigentlich nicht tun. Fühlen Sie sich frei, um es zu Bearbeiten.
- Ich bin mir nicht sicher, @Matt. Wenn der code geändert wird, für Klassen-Methoden, dann gibt es keine Notwendigkeit für
-dealloc
. Wenn der code geändert wird, um eine Instanz-variable dann ARC kümmert sich um Sie freizulassen. Darüber hinausstatic
nicht wirklich Einfluss auf den code, da dessen Funktion es ist, zu begrenzen die Sicht/Verknüpfung dieser Variablen zu ExampleClass.m — memory-management wäre das gleiche, wennstatic
entfernt wurden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, weil, da Sie nicht angeben, eine Eigentums-Vermerk, der LLVM-compiler folgert, dass
exampleString
hat__strong
Eigentums-Qualifikation.Dies bedeutet, dass durch die Festlegung
exampleString
zunil
imdealloc
, Sie haltennil
(neuer Wert), die tut nichts ist, und loslassen der alt-Wert.Quelle
Gemäß § 4.4.3. Template-Argumente der LLVM-Dokumentation auf Objective-C Automatic Reference Counting (ARC), "Wenn ein template-argument für eine Vorlage-Typ-parameter ist ein retainable Objekt-Besitzer geben, der nicht über eine explizite Eigentum qualifier, es eingestellt zu haben
__strong
Qualifikation."Und gemäߧ4.2. Semantik, "Für
__strong
Objekte, die neue pointee wird zunächst beibehalten; zweitens, die lvalue ist geladen mit primitiven Semantik; drittens, die neue pointee ist gespeichert in der lvalue mit primitiven Semantik; und endlich, die alte pointee ist veröffentlicht. Dies ist nicht atomar durchgeführt; externe Synchronisation müssen genutzt werden, um diese sicher in das Gesicht der gleichzeitigen lädt und speichert.