2 Stimmen

Objective-C: Wie kann man feststellen, welches andere Objekt ein bestimmtes Objekt behält?

Gibt es in Objective C eine Möglichkeit, zur Laufzeit festzustellen, ob ein Objekt beibehalten wird und welches andere Objekt dieses Objekt beibehalten könnte?

Oder um es etwas anders zu formulieren:

Wenn der Hund angeleint ist, ist es dann möglich zu wissen, wer die Leine hält?

Angenommen, Sie haben folgendes hypothetisches Szenario:

MyObjectOne

y

MyObjectTwo

innerhalb der Implementierung von MyObjectTwo ist etwa so

- (void)setFirstObject:(MyObjectOne *)firstObj {
 [firstObj retain];
    // do stuff with object and under certain conditions don't release it    
}

An anderen Stellen des Codes kann es andere Stellen geben, an denen die Objekte erstellt und aufbewahrt werden

// Create the two objects
myFirstObject = [[MyObjectOne alloc] init];   
mySecondObject = [[MyObjectTwo alloc] init];

// ...
// Some process requires retaining the first object 
[myFirstObject retain]

// ...
// some other place requires passing the first object to the second object
// at which point the first object is retained by the second object 
[mySecondObject setFirstObject:myFirstObject];

// ...
// further on the first object is released
[myFirstObject release]

Zu diesem Zeitpunkt sollte myFirstObject theoretisch einen Retain Count von 1 haben, da es innerhalb von MyObjectTwo behalten wurde. Ist es auch möglich zu wissen, WAS das Objekt beibehält? Mit anderen Worten, ist es möglich zu wissen, dass myFirstObject einen Retain Count von 1 hat UND dass es derzeit von mySecondObject gehalten wird. Gibt es eine einfache Methode, um diese Informationen herauszufinden? Ist es möglich, einen bedingten Code zu haben, der wie dieser Pseudocode funktioniert:

if (MyObjectTwo is retaining MyObjectOne)
{
 // do something in particular
}

Gehen wir noch ein paar Schritte weiter und nehmen wir an, dass MyFirstObject einen Retain-Wert von mehr als 1 hat und dass es weitere Objekte MyObjectThree und MyObjectFour gibt, die sich ähnlich wie MyObjectTwo verhalten, indem sie Methoden haben, die MyObjectOne behalten können. Und nun nehmen wir an, dass es mehrere Instanzen von MyObjectTwo, MyObjectThree und MyObjectFour gibt, von denen einige das erste Objekt behalten und andere nicht. Gibt es eine Möglichkeit, herauszufinden, wer und was das Objekt zurückhält?

Ich lerne noch, daher ist meine Syntax vielleicht nicht 100% korrekt, aber ich hoffe, die Frage ist klar.

6voto

Adam Rosenfield Punkte 373807

Nein, das können Sie nicht tun. Objekte behalten nicht den Überblick darüber, wer sie behalten hat, und es gibt nicht immer ein solches Objekt, denn Sie können retain innerhalb einer einfachen C-Funktion, die kein zugehöriges Objekt hat.

Wenn Sie den Überblick darüber behalten wollen, wer ein Objekt behält, müssen Sie dies selbst tun. Jedes Mal, wenn Sie ein Objekt behalten, fügen Sie sich selbst zu einer Liste von Behaltenden hinzu, z. B. einer NSArray im Inneren des aufbewahrten Objekts.

Ich weiß nicht genau, was Sie zu tun versuchen, aber Sie gehen mit Sicherheit den falschen Weg. Herauszufinden, wer was einbehält, ist in den meisten Fällen nicht wirklich von Nutzen, und es gibt wahrscheinlich einen viel besseren Weg, das zu tun, was Sie wollen.

6voto

zoul Punkte 99332

Wenn Sie einfach nur etwas debuggen wollen, können Sie die retain Methode der Klasse, deren Instanz im Speicher stecken zu bleiben scheint. Setzen Sie dann einen Haltepunkt in der überschriebenen Methode, und jedes Mal, wenn der Haltepunkt ausgelöst wird, sehen Sie den Retainer auf dem Stack.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X