Unter Verwendung des Verfahrens NSObject -(id)awakeAfterUsingCoder:(NSCoder *)decoder
als Beispiel sagt der Dokumentation:Was ist das neue Muster für die Freigabe von Selbst mit automatischer Referenzzählung?
Gibt einem Objekt, nachdem, dekodiert wird ein anderes Objekt für sich zu substituieren. Zum Beispiel kann ein Objekt, das eine Schriftart darstellt, nach der Decodierung von sich selbst freigeben und ein vorhandenes Objekt zurückgeben, das die gleiche Schriftbeschreibung wie die Schriftart hat. Auf diese Weise können redundante Objekte eliminiert werden.
Normalerweise würden Sie
[self release];
return substitutedObject;
Mit ARC tun Sie diese Zeile aus verlassen. Würde das nicht lecken? Oder sollte ich nur dem NSCoder-Objekt vertrauen, um das ursprüngliche Objekt für mich freizugeben? Wenn ja, warum müssten Sie zuerst selbst mit Nicht-ARC-Code explizit freigeben?
Ich glaube nicht self = nil
ist richtig in Anbetracht dessen, was der Compiler-Dokumentation sagt über sich selbst: http://clang.llvm.org/docs/AutomaticReferenceCounting.html#misc.self
Können Sie erklären, warum Sie das Ergebnis explizit beibehalten müssen? Sicher, das besiegt den Zweck von ARC. Danke, dass du alles andere beantwortet hast. – jamesmoschou
@ moshy du bist willkommen. Ja - ich habe dieses Detail zunächst übersehen. Der Grund dafür ist, dass 'awakeAfterUsingCoder:' eine nicht-besitzende (oder automatisch freigegebene) Referenz zurückgibt. Daher fügt ARC für unseren Rückgabewert eine Ref-count-Dekrement für uns ein. Was wir tun wollen, ist effektiv * Transfer * die Referenz von einem Objekt zum anderen. Ich lief es in Instrumenten - keine Lecks. keine Zombies. ohne die explizite Zurückhaltung würde ein Zombie gemeldet werden. ohne die explizite Freigabe - ein Leck. Probieren Sie es selbst aus (setzen Sie den Block '@ autoreelease' in' while (1) '). – justin
Könnten Sie die Methode mit '__attribute __ ((objc_method_family (init)))' zu einem Mitglied der 'init'-Familie machen und dann' self' neu zuweisen? –