2009-02-25 12 views
5

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

20

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.

8

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.

43

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]; 
} 
+0

Wie konnte man sehen, wer das Objekt ist beibehalten? Das einzige Argument ist das Selbst, oder? – quano

+5

quano - Sie schauen sich den Stack-Trace vom Debugger an. Sie werden genau sehen, wer anruft. – danielpunkass

+0

Großartige Idee. Vielen Dank! – mtrc

1

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

Verwandte Themen