Wie kann ich überprüfen, ob ein Objekt freigegeben wird?
Ich muss in der Lage sein zu überprüfen, ob ich bereits veröffentlicht, eine variable in objective-c. Ich habe versucht, überprüfen Sie, ob es geändert auf null:
//Checks if buildview is null and returns respective output
if(BuildView == NULL)
NSLog(@"Build View Value (pointer): Null");
else
NSLog(@"Build View Value (pointer): Not Null");
//allocates memory and initalizes value
BuildView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
//Checks if buildview is null and returns respective output again
if(BuildView == NULL)
NSLog(@"Build View Value (pointer): Null");
else
NSLog(@"Build View Value (pointer): Not Null");
//Releases the view
[BuildView release];
//Checks if buildview is null and returns respective output again
if(BuildView == NULL)
NSLog(@"Build View Value (pointer): Null");
else
NSLog(@"Build View Value (pointer): Not Null");
Waren die Ergebnisse:
Build View Value (pointer): Null
Build View Value (pointer): Not Null
Build View Value (pointer): Not Null
Ist es einfacher Weg, um zu überprüfen, wenn es freigegeben wird?
Was Sie scheinen zu Fragen ist nicht, wenn das Objekt freigegeben wurde, aber eher, wenn es wurde freigegeben.
möglich, Duplikat der Wie Sie feststellen, wenn ich einen Zeiger auf Objekt freigegeben?
möglich, Duplikat der Wie Sie feststellen, wenn ich einen Zeiger auf Objekt freigegeben?
InformationsquelleAutor rdelfin | 2011-10-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du meinst wohl freigegeben (zerstört), nicht veröffentlicht. Als veröffentlicht, bedeutet nicht, dass freigegeben, das ist der Punkt der Referenz gezählt Speicher-management. Freigegeben ist kein Staat, Sie können nicht kontrollieren, zerstört wird.
Wenn du meinst freigegeben ist, dann Nein, es gibt keine. Es heißt schwache Referenz, und Objective-C nicht für die Verweiszählung. Wenn ein Objekt freigegeben wird, nichts erfolgt automatisch zu Zeiger auf es, Sie werden dangling Pointer.
Eine Technik ist, damit das Objekt eine Benachrichtigung senden, während die Freigabe, so dass alles hält, dass ein Zeiger kann es zurücksetzen auf null.
In der Regel müssen Sie Ihr Programm entwerfen, in einer Weise, dass kein Objekt-pointer wird wieder verwendet, nachdem Sie genannt
release
. In der Beispiel-code, den Sie gegeben haben, müssen Sie nichtBuildView
wieder für irgendetwas anderes außer der Zuweisung einen neuen Wert ein.InformationsquelleAutor hamstergene
Normalerweise sollten Sie nicht brauchen, um zu überprüfen, ob ein Zeiger auf ein Objekt freigegeben: Sie sollten wissen 🙂 Ihr Variablen halten Sie einfach einen Speicher-Adresse. Wenn der Inhalt der Speicher, den die variable verweist, freigegeben wird, wird der Wert der variable (hält sich die Adresse) wird nicht auf Magische Weise gesetzt werden, auf null oder NULL.
Also sollte man eher überdenken Sie Ihre design, wenn Sie finden es notwendig, zu prüfen, ob ein Zeiger verweist auf eine Adresse Speicherplatz, der bereits freigegeben wurde/ausgeplant.
Während der Entwicklung können Sie Dinge tun, wie aktiviere NSZombies oder verwenden Sie Instrumente, um herauszufinden, wo Objekte verteilt werden, oder freigegeben werden.
Update 6/26/2015: Wenn Sie mit
weak
Zeiger auf OS X 10.7 und höher und auf iOS 5 und höher, werden Sie automatisch eingestellt werden, umnil
wenn das referenzierte Objekt freigegeben wird. Sehen https://en.wikipedia.org/wiki/Automatic_Reference_Counting#Zeroing_Weak_ReferencesInformationsquelleAutor Johannes Fahrenkrug
Nach Freigabe eines Objekts den Wert des Objektes nicht festgelegt werden
nil
.retainCount
auf Objekt zerstört wird, geben Sie Abstürzen oder anderen undefinierten Verhalten, nicht null ist.In der Tat, ist die wahrscheinlichste Ergebnis, dass bestimmte code-Beispiel ist, dass
retainCount
zurückkehren würde, 1 sogar wenn es wurde aufgehoben!InformationsquelleAutor Parag Bafna
Dank "Kakao mit Liebe" könnte man versuchen, diese
http://www.cocoawithlove.com/2010/10/testing-if-arbitrary-pointer-is-valid.html
InformationsquelleAutor NicTesla