2011-01-03 6 views
1

Ich habe eine init Methode, die Werte von einem NSDictionary nimmt. Dies ist in meinem Friend Objekt.Memory Management: Freigeben von benutzerdefinierten Objekten im Konstruktor - Objective-C

Meine Frage ist, wann ich diese bestimmte Instantiierung von Friend freigeben?

- (id)initWithValue:(NSString *)value { 
    Friend *friend = [[Friend alloc] init]; 
    friend.friendId = [value valueForKeyPath:@"id"]; 
    friend.friendName = [value valueForKeyPath:@"name"]; 

    return friend; 
} 

Ich nenne die init unten Methode

for (id value in dataDict) { 
    Friend *friend = [[Friend alloc] initWithValue:value]; 
    [friends addObject:friend]; 
    [friend release]; 
} 

die Friend Objekte zu einem friends Array hinzufügt ich dann folgend in Code:

Friend *friend = (Friend *)[friends objectAtIndex:indexPath.row]; 

Wenn ich das Friend Objekt autorelease in der init Methode dann bekomme ich eine Nachricht gesendet wurde, um zu entziehen d Instanz, wenn ich den obigen Code verwende, um den Wert für bestimmte Objekte basierend auf indexPath.row zu erhalten.

Antwort

1

Ihre Frage nicht direkt beantworten, aber diese Zeilen Code sind definitiv gefährlich:

- (id)initWithValue:(NSString *)value { 
    [super init]; 
    self.friendId = ...; 
    self.friendName = ...; 

    return self; 
} 
+0

später auf der ganzen Strecke, die ich ging tatsächlich mit der initWithValue Art und Weise, Dinge zu tun. Es macht nur mehr Sinn und es bedeutet nicht, dass ich das Objekt in der tatsächlichen Methode initialisieren muss. Danke dafür! – fuzz

1

Und direkt beantworten sie:

- (id)initWithValue:(NSString *)value { 
    Friend *friend = [[Friend alloc] init]; 

Stattdessen Sie so schreiben sollten Ihre zugeordneten Objekte loslassen NUR wenn du mit ihnen fertig bist. Erstellen Sie eine Methode und rufen Sie [Objektfreigabe] auf; für alle Ihre zugewiesenen Objekte. Auf diese Weise vermeiden Sie Speicherzuordnungsinkonsistenzen, und dieser Ansatz ist besser als das Aufrufen der Autorelease.

3

Ein paar Dinge:

  • eine init Methode alloc sollte nicht Aufruf (diwup Vorbild für die richtige Art und Weise sieht ein init zu tun)

  • es so aussieht, was Sie versuchen, Zu tun ist eine Bequemlichkeitsmethode, die ein (automatisch freigegebenes) Objekt erstellt, initialisiert und zurückgibt (ähnlich wie +NSString stringWithFormat: usw.). Sie haben es fast geschafft, aber Sie müssen es (a) nicht "init *" nennen und (b) es zu einer Klassenmethode und nicht zu einer Instanzmethode machen.

Etwas wie:

+ (Friend)friendWithValue:(NSString *)value { 
    Friend *friend = [[[Friend alloc] init] autorelease]; 
    friend.friendId = [value valueForKeyPath:@"id"]; 
    friend.friendName = [value valueForKeyPath:@"name"]; 

    return friend; 
} 

würden Sie das wie verwenden:

[friends addObject:[Friend friendWithValue:value]]; 
+0

Vielen Dank für die Bereitstellung einer solchen informativen Antwort. Alles ist jetzt sinnvoll, sehr geschätzt. – fuzz

Verwandte Themen