2012-04-11 13 views
0

Ich habe einen Setter wie folgt aus:iPhone - Wird dieses Leck?

- (UIImagePickerController *) foto { 

    if (_foto == nil) { 
     _foto = [[UIImagePickerController alloc] init]; 
     _foto.delegate = self; 
    } 
    return _foto; 
} 

es wie

@property (nonatomic, retain) UIImagePickerController *foto; 

mit

@synthesize foto = _foto; 

auf meinem dealloc

Ich habe erklärt
[_foto release]; 

An einem gewissen Punkt in meinem Code Ich mag diesen

self.foto = nil; 

aber etwas in meiner Seele tun, sagt das zu self.foto zugewiesen Objekt vorher undicht wird, weil es alloc auf dem Setter war ... wie mache ich es richtig?

danke.

+0

_foto = selbst; macht für mich keinen Sinn? Ich verstehe das nicht. (Ich würde es nie benutzen, aber vielleicht weißt du viel mehr als ich). –

+0

Entschuldigung, es war ein Tippfehler. Das richtige ist _foto.delegate = selbst ... – SpaceDog

+1

ahh danke. Ich dachte, das sei sehr seltsam. –

Antwort

1

Edit: Nein, das sollte in Ordnung sein. Solange Sie _foto vor der Veröffentlichung nichts anderes zuweisen, sollte es funktionieren.

Yup. Sie erstellen ein Objekt und verlieren dann den Zeiger darauf. Wenn Sie eine Autorelease in die Init-Zeile werfen, wird das Problem behoben. Sie könnten auch ARC verwenden.

Die Init-Zeile tut eigentlich nichts ... Sie weisen den Zeiger einem von Ihnen erstellten Objekt zu und weisen es dann einem anderen Objekt zu.

+0

Also, was Ihre Idee ist, eine Autorelease auf den Setter zu setzen und die [_foto Release] aus dem Dealloc entfernen? (Ich kann ARC in diesem Projekt nicht verwenden) – SpaceDog

+0

Es macht nichts, es sollte mit Ihrer Bearbeitung in Ordnung sein. –

1

Ich glaube nicht, dass dort ein Leck ist. Wenn Sie self.foto wie folgt zuweisen: self.foto = nil;, wird die vorherige automatisch freigegeben. Wenn Sie es folgendermaßen zuweisen: _foto = nil;, müssen Sie es vor der Zuweisung manuell freigeben.

0

Ja, das funktioniert, und wird nicht lecken. Wenn Sie den Wert _foto festlegen, ist die Anzahl seiner Retouren 1 (weil Sie alloc aufgerufen haben). Solange Sie es freigeben (was Sie gesagt haben) in dealloc, sollten Sie in Ordnung sein, wie die Retain-Anzahl wird auf 0 zurückgehen. NUR, wenn Ihr Setter ist auch von Ihnen geschrieben und falsch geschrieben. Es muss den alten Wert explizit freigeben, wenn es nicht nil ist. Etwas wie dieses:

- (void)setFoto:(UIImagePickerController*)foto { 
    if (_foto) { 
      [_foto release]; 
      _foto = nil; 
    } 
    if (foto) 
      _foto = [foto retain]; 
} 
+0

wie yibuyiqu sagt, wenn Sie eine Eigenschaft mit 'retain' deklariert haben, wird automatisch der alte Wert freigegeben. Voila, kein Leck! – samson

+0

Eigentlich solltest du vorsichtig sein - wenn du nur '' _ photo release '' in 'dealloc' schreibst und du deinen Getter noch nicht aufgerufen hast, wirst du einen Absturz bekommen. Stellen Sie sicher, dass der Zeiger nicht Null ist, zuerst: 'if (_foto) [_foto release];' – samson

+2

Senden einer Release-Nachricht (oder eine beliebige Nachricht) zu einem Null-Zeiger wird nicht abstürzen. Es ignoriert die Nachricht. – borrrden