Ich habe einen UIViewController, der eine RetainCount von 3 hat, sobald ich es instanziiere. Das irritiert mich so schrecklich falsch. Was ist der beste Weg herauszufinden, wer den retainCount auf 3 erhöht hat? Ich würde mir vorstellen, das Objekt instanziieren sollte den Zeiger 1 geben, dann nehme ich an, es vielleicht auf den UINavigationController Stapel stapeln könnte es (aber nicht sicher?), Aber die dritte .. ist ein Rätsel.Suchen, wer eine Retain-Zählung zu einem Objekt hat
Antwort
Verlassen Sie sich niemals direkt auf Retain Counts. Was passiert ist, ist, dass während des Initialisierungsprozesses ein Stück Code retain
ed und autorelease
d das Objekt hat. Da Sie nicht wissen können, wie oft ein Objekt autorelease
d war, wissen Sie nicht wirklich, was die echte Retain-Anzahl ist.
beibehalten Zählungen sollten nur als Testhilfe verwendet werden, nie als Programmablaufsteuerung.
Solange Sie alle Regeln befolgen, die in der Memory Management Programming Guide for Cocoa dargelegt sind, werden Sie keine Probleme haben.
Was ist der beste Weg herauszufinden, wer den retainCount auf 3 erhöht hat?
Das nähert sich dem Problem aus dem falschen Winkel. Diese wird verwirren Sie und wird führen Sie in die Irre (und wahrscheinlich rechts vorbei) das eigentliche Problem, wenn es tatsächlich eine gibt.
Besser zu denken, wer besitzt das Objekt. Beabsichtigen Sie, das Objekt als Wert einer Ihrer eigenen Eigenschaften zu behalten? Wenn ja, dann sind Sie einer seiner Besitzer. Wenn nicht, dann bist du es nicht. Wenn Sie das Objekt an ein anderes Objekt übergeben, das in einer seiner Eigenschaften gespeichert werden soll, ist dieses andere Objekt ebenfalls ein Eigentümer.
Diese Besitzverhältnisse sind nur Beziehungen, so dass es wirklich einfach ist, sie im Kopf zu behalten.
- "Dies ist einer meiner Controller. Es besitzt die Stammobjekte meines Modells und einen oder mehrere View [Controller] s. "
- " Dies ist eine Ansicht. Es besitzt einige Teile meines Modells. "
- " Das ist Teil meines Modells. Es besitzt nur primitive Objekte. "
- " Dies ist ein weiterer Teil meines Modells. Es besitzt einige primitive Objekte und einige andere Bits des Modells.“
Wenn Sie ein solides Verständnis Ihrer Eigentumsrechte haben, dann Sie können nicht ein Speicherleck schreiben, außer durch eine release
oder autorelease
Nachricht zu vergessen (was passieren kann, zu jemandem), und Sie werden fast sicher keine zyklische Retention schreiben (zwei Objekte, die sich gegenseitig behalten), außer wissentlich und mit reichlichen Kommentaren und # Warnungen.
Wenn Sie Ihre Besitzverhältnisse noch nicht ausgearbeitet haben, dann haben Sie wahrscheinlich einen oder mehrere Speicherlecks oder zyklische Retentionen geschrieben, von denen Sie nichts wissen.
Edit: Und die eigentliche Frage zu beantworten, ist der beste Weg, um herauszufinden, was beibehalten-und hat möglicherweise anschließend Autoreleased-Objekt ist zu Verrechnungen Instruments der Verwendung Instrument. Damit können Sie sich die Historie jedes Objekts ansehen, um jede Zuordnung, Aufbewahrung, Autorelease, Freigabe und Freigabe seiner Adresse zu sehen.
Adam hat Recht, dass Sie sich nicht zu sehr Gedanken über Retain Counts machen sollten.
Aber wenn Sie jemals ein berechtigtes Bedürfnis haben, ein solches Mysterium zu lösen, ist es eine gute Technik, die betroffene Klasse zu unterklassifizieren, nur damit Sie die Speicherverwaltungsmethoden überschreiben können.
z. in einer Unterklasse von UIViewController, könnten Sie implementieren:
- (id) retain
{
// Break here to see who is retaining me.
return [super retain];
}
Es ist nicht eine 100% ige Lösung, aber der LLVM Clang Static Analyzer kann bei der Verfolgung falsche manuelle Speicherverwaltung Nutzung eine große Hilfe sein. Zwischen dem Static Analyzer und MallocDebug können Sie ein Profi sein, um Speicherverwaltungsprobleme schnell zu erkennen. Übrigens, obwohl Instruments die neue Schärfe ist, finde ich MallocDebug weitaus zuverlässiger.
Sie können die LLVM Clang Static Analyzer finden Sie hier: LLVM/Clang Static Analyzer
- 1. Wer hat UWSGI erstellt?
- 2. Wer hat eine Kopie von MSIINV.EXE?
- 3. Wer hat einen "Lesezeitalgorithmus"?
- 4. Suchen einer Teilzeichenfolge in einem NSString-Objekt
- 5. Wer hat JaikuEngine erfolgreich adoptiert?
- 6. Wer hat Miller-Säulen erfunden?
- 7. Microsoft SQL Server - Wer hat eine Stored Procedure erstellt?
- 8. Wer hat --standalone Option, um in F # CTP zu arbeiten?
- 9. Wie finde ich heraus, wer eine Garnanwendung getötet hat?
- 10. Wer hat zuletzt eine Mailbox geändert? Exchange 2010 (PowerShell)
- 11. Absicht Ergebnis, wie zu wissen, wer es gesendet hat?
- 12. Mein Regex hat eine langsame Leistung, wer kann es optimieren?
- 13. Wie finde ich heraus, wer eine Methode aufgerufen hat?
- 14. Wer hat Ruby mit MySQL 5.1 zu arbeiten?
- 15. Wer hat Erfahrung mit CSLA unter Mono?
- 16. Wie kann ich nach einem Wert in einem Objekt suchen?
- 17. Gibt es eine Möglichkeit zu sehen, wer eine Datei in Linux angezeigt/zugegriffen hat?
- 18. Methode, die nichts mit einem Objekt zu tun hat
- 19. eine DataRow zu einem Objekt Domain-Klasse Convert
- 20. Wer hat die switch statement erfunden?
- 21. Wer hat in gdb Reverse-Debugging versucht?
- 22. Wer hat die Autovervollständigung für linqpad gekauft?
- 23. Wie kann ich verfolgen, wer einen Kommentar zu einem TFS-Arbeitselement eingegeben hat?
- 24. Eine private Referenz zu einem Objekt hinzufügen
- 25. Ersetzen Hash Argumente mit einem Objekt hat
- 26. TypeError Objekt [Objekt Objekt] hat keine Methode SubSelf, TypeError Objekt [Objekt Objekt] hat keine Methode Schnittpunkte
- 27. Wie bekomme ich eine Liste aller SVN-Commits in einem Repository und wer hat was zu welchen Dateien gemacht?
- 28. Anfügen zu einem Objekt
- 29. Wer kennt eine gute Dokumentation der Bannerrotation?
- 30. zu einem Objekt hinzufügen
Wie konnte man sehen, wer das Objekt ist beibehalten? Das einzige Argument ist das Selbst, oder? – quano
quano - Sie schauen sich den Stack-Trace vom Debugger an. Sie werden genau sehen, wer anruft. – danielpunkass
Großartige Idee. Vielen Dank! – mtrc