Frage

ich zu verstehen versuchen, was unten in dem Getter geschieht, das ist, was ich verstehe so weit:

(1) kehrt der Getter einen Zeiger auf ein Objekt NSString. (2) die NSString Objekt beibehalten wird, möglicherweise, weil wir nur einen Zeiger auf sie verschenkt. (3) Autofreigabe? wenn geht das activate, wenn die PlanetClass Instanz freigegeben wird (freigegeben)?

// CLASS
@interface PlanetClass : NSObject {
        NSString *planetName;
}
- (NSString *)planetName;
- (void)setPlanetName:(NSString *)value;
@end

// GETTER
- (NSString *)planetName{
        return[[planetName retain] autorelease];
}

EDIT: Ich glaube, ich bin mehr verwirrt über den Grund für die tatsächlichen behalten und später Release. mein Verständnis war, dass der Getter einfach einen Zeiger auf entweder null oder ein Objekt zurück, das bereits vorhanden ist (dh von der Setter gesetzt wurde) Ich glaube, ich verstehe das behalten, wie wir einen Zeiger verlosen und das müssen wir verfolgen, aber was die Freigabe ist, dass nur eine ausfallsichere einhüllen ich später das NSString Objekt freizugeben vergessen?

Die Instanzvariable planetName ist auch in meiner dealloc Methode lösen (siehe unten) Autofreigabe scheint das gleiche zu tun, nur später, wenn der Pool leer ist?

- (void)dealloc {
        [planetName release];
        [super dealloc];
}

prost -gary -

War es hilfreich?

Lösung

Es könnte eine gute Idee sein, Objective-C behandelt dies als eine Eigenschaft zu lassen, so dass Sie einen Teil der Implementierung aufzuzuräumen, um die Speicherverwaltung zu halten, nun ja, überschaubar:

@interface PlanetClass : NSObject {
    NSString* planetName;
}
@property(nonatomic, retain) NSString* planetName;
@end // PlanetClass

@implementation PlanetClass
@synthesize planetName
//... rest of PlanetClass here
@end // PlanetClass

Es gibt viel von docs verfügbar Online für weitere Details über Objective-C Eigenschaften und @synthesize.

Speicherverwaltung Text & Tabellen

Ich empfehle dieses Lesen von Apple auf Speicher Management zu versuchen und helfen, zu verstehen, was all der retain / release Tumult über ist.

Andere Tipps

Wenn Autofreigabe an ein Objekt gesendet wird, wird es den Autofreigabepool hinzugefügt. Wenn der Pool leer ist, sendet er Mitteilung an alle Objekte im Pool. Also jedes Objekt in dem Autofreigabepool wird Release sein, wenn der Pool leer ist

Die Rückkehr / Autorelease in der Getter-Methode ist etwas nicht tun, können Sie einfach zurückgeben planetName

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top