2011-01-08 4 views
1

ich in der Apple-Dokumentation über copyWithZone lesen:copyWithZone Rückgabewert Eigentums- und Beibehaltungszähler

„Das zurückgegebene Objekt ist implizit vom Absender erhalten, die sie für die Freigabe verantwortlich ist“.

Also, wenn ich das schreibe:

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

     return obj; 
    } 

und ich rufe:

MyStuff* obj = [varobj copy]; 

wird obj beibehalten werden? Was ist mit der Retain-Anzahl, wenn ich keine Autorelease einstelle?

Antwort

3

Nicht automatisch freigeben in Ihrer copyWithZone Methode, oder Sie werden es nicht besitzen (und wahrscheinlich wird nicht in der Lage sein, überhaupt etwas damit zu tun).

Entfernen Sie die Autorelease und obj wird in der MyStuff Kopie entsprechend beibehalten. Sie müssen einfach release es, wenn Sie damit fertig sind.

Der Apple-Satz sagt, dass der Absender - der Ihre MyStuff *obj Initialisierung ist - Eigentümerschaft hat und es freigeben muss. "Absender" bezieht sich auf das Objekt gesendet die copy Nachricht, nicht Ihre copyWithZone Methode.

+0

@Matthew Frederick: ok, also gibt es keine IMPLICIT behalten, wie Apple Dokumentation sagt. Es ist eine explizite aufgrund Ihres Codes? – Oliver

+0

Lesen Sie meine bearbeitete Version. Da der Absender eine Kopie ausführt, behält sie diese jetzt implizit bei. Das ist ziemlich explizit für mich, aber das Wort "behalten" wird nirgends verwendet und macht es implizit. –

+0

@Matthew Frederick: ok, also was, wenn ich die Autorelease entfernen? Es gibt ein Behalten innerhalb des Anrufs, und ein implizites außerhalb des Anrufs, nicht wahr? Mit anderen Worten, was ist IMPLICIT hier? Ich sehe nur explizite Dinge, oder es wird zwei behalten. – Oliver

Verwandte Themen