2011-01-08 7 views
0

Ich lese in der Apple-Dokumentation über copyWithZone: "Das zurückgegebene Objekt wird implizit vom Absender behalten, der für die Freigabe verantwortlich ist". Aber ... Wie kann ich etwas freigeben, das ich zurückgebe ... Ich werde verrückt!iPhone: copyWithZone: Freigabe eines Objekts vor seiner Rückkehr?

Probe Code:

- (id)copyWithZone:(NSZone *)zone { 
     MyObject* obj = [[[self class] allocWithZone:zone] init]; // explicit retain 
     [obj fillTheObj]; 

     return obj; // implicit retain 
    } 

Wo soll das gesagt Release sein? Ich behalte zweimal? Uhhh ...

Antwort

1

Der Absender ist verantwortlich für die Freigabe. Das heißt, wer auch immer Ihre Kopiermethode aufruft, übernimmt Besitz, z. B .:

MyObject *obj = ... 
MyObject *aCopy = [obj copy]; 
... do stuff with aCopy 
[aCopy release]; 
+0

Okkkk, der Absender des Aufrufs, nicht der Absender des Objekts. Das ist klarer. Aber ich werde wirklich verrückt. Also ... Ich kann myObject.var = [localvar copy] mit einer Eigenschaft in myObject übergeben, die als retain definiert ist und im dealloc freigegeben wird. Das würde gut funktionieren, oder? – Oliver

+0

@Oliver - Sie werden über-behalten, wenn Sie das getan haben. Wenn die 'var' -Eigenschaft als' retain' deklariert ist, wäre die korrekte Zuweisung 'myObject.var = [[localvar-Kopie] Autorelease]'. Aber es klingt wie das, was Sie wirklich wollen, ist, die Eigenschaft als 'copy' zu deklarieren, dann können Sie einfach' myObject.var = localvar'. –