Ich habe ein Beispielprojekt in xcode 4.2 erstellt und festgestellt, dass das neue Projekt mit ARC eingerichtet wurde.
Ich habe eine Methode unten gezeigt. Zuvor hätte ich die Zelle in der Methode automatisch freigegeben und die Tabellenansicht des Aufrufers die Zelle beibehalten lassen. Mit ARC wäre eine Autoreleasing nicht möglich,
%Vor%Wenn ich das Analyse-Tool auf dem obigen Code ausführe, wird ein Speicherleck des Objekts "Zelle" angezeigt.
Wie sollte das Obige mit ARC geschrieben werden, damit die Analysewarnung verschwindet? Was mache ich falsch?
Danke.
Ihre Methode getCellForIndex:
weist ein Objekt zu und gibt es zurück, auf diese Weise ähnelt es einem geraden alloc
(tatsächlich ist Ihr Code nur ein alloc
mit einer Initialisierung).
Da ARC die tatsächliche Implementierung einer Methode beim Aufrufen nicht sehen kann, muss eine Annahme über den Besitz des zurückgegebenen Objekts gemacht werden, und diese Annahme ist, dass der Besitz nicht übertragen wird. Beim Kompilieren Ihrer Implementierung bemerkt ARC, dass Ihr Code diese Annahme verletzt und Sie warnt.
Sie können die Annahme außer Kraft setzen, indem Sie der Methode in @interface
und @implementation
ein explizites Attribut hinzufügen:
ARC weiß nun, dass der Objektbesitz übertragen wird. Methoden in den Familien alloc
, new
usw. haben dieses Attribut automatisch hinzugefügt. Da andere Antworten darauf hinweisen, dass Sie Ihre Methode vielleicht besser umbenennen sollten, könnte newCellForIndex:
hier angebracht sein, da new
für eine Kombination von alloc
und init
verwendet wird, was Ihrer Methode entspricht.
BTW: Ändern Ihrer zweiten & amp; dritte if
's zu else if
würde Ihren Algorithmus klarer machen (und etwas schneller, aber das ist nicht der Grund dafür).
Frage im Kommentar:
ARC führt neue Attribute usw. ein, verwendet aber auch Inferenz und Standardwerte, so dass Sie, wenn Sie normalen Cocoa-Konventionen folgen, diese nicht zu oft brauchen sollten - natürlich YMMV ... Zusätzlich zu Apples Dokumentation finden Sie eine Beschreibung < a href="http://clang.llvm.org/docs/AutomaticReferenceCounting.html"> hier .
Versuchen Sie, die Methode in -cellForIndex umzubenennen :, "get" -prefixed-Methoden haben ein anderes implizites Verhalten in Cocoa.
(Vielleicht auch -cellAtIndex: aus Gründen der Konsistenz mit NSArray usw.)
Tags und Links objective-c automatic-ref-counting