8 Stimmen

Warum wird das Objekt nach dem Senden einer Freigabenachricht in Obj-C auf Null gesetzt?

Ich sehe eine Menge Objective-C-Code, der die folgende Syntax hat, wenn versucht wird, Objekte aus dem Speicher zu befreien, wenn sie nicht mehr benötigt werden.

[controller release], controller = nil;

Warum wird die Variable nach dem Senden der Freigabenachricht auf Null gesetzt? Wird das Objekt durch die Freigabe nicht auf jeden Fall freigegeben? Warum muss es auch auf Null gesetzt werden?

Ist dies nur eine "altmodische" Art, Dinge in Obj-C zu tun, oder steckt mehr dahinter, als mir klar ist?

7voto

jbrennan Punkte 11703

Aufruf von release für ein Objekt bedeutet nicht unbedingt, dass es freigegeben wird. Es wird lediglich der Retain Count des Objekts dekrementiert. Erst wenn der Retain Count 0 erreicht, wird das Objekt freigegeben (und selbst dann könnte sich das Objekt in einem Autorelease-Pool befinden und immer noch nicht ganz freigegeben sein).

Sie könnten also Ihr Objekt freigeben, aber Sie könnten immer noch darauf verweisen. Und dann könnte es automatisch wieder freigegeben werden. Und dann schickst du ihm eine Nachricht - aber vielleicht ist das Objekt jetzt Müll. Das ist schlecht.

Wenn Sie Ihren Zeiger auf null setzen, nachdem Sie ihn freigegeben haben, können Sie keine Nachricht an ein verstümmeltes Objekt senden. Sie sind fertig mit diesem Objekt und können sagen, was immer Sie wollen, um nil , kein Schaden entstanden.

2voto

danyowdee Punkte 4618

Zwei Dinge

  • Wie jbrennan feststellte, kann man den Objekt-Zeiger aufheben wird verhindern, dass Ihr Programm bei der Verwendung eines zuvor dealloc Objekt.
    Ich halte das allerdings für eine schlechte Sache, da Sie auf diese Weise wahrscheinlich einen Fehler oder eine konzeptionelle Schwäche im Code verschleiern.
    Wenn - andererseits - das Objekt, das Sie gerade freigegeben haben, aus dem Geltungsbereich herausgeht oder aus anderen Gründen definitiv nicht mehr verwendet wird, wird diese Zuweisung vom Compiler während der Optimierung ohnehin entfernt.
  • In einer Umgebung, in der Müll gesammelt wird, ist das Senden von release zu einem Objekt hat keine Auswirkung .
    Je nach was Sie tun und wobei Sie tun es, indem Sie den Objektzeiger auf null setzen Mai den Unterschied ausmachen, ob der GC das Objekt ernten wird oder nicht.
    Ohne die Zuweisung ist das Objekt also Mai weiterleben und würde nicht nur Ressourcen blockieren, sondern ist voll lebendig und gültig, Mai ungewollte Nebenwirkungen hervorrufen.

0voto

Ferruccio Punkte 96076

Da das Senden einer Nachricht an ein Nil-Objekt in Objective-C eine gültige Operation ist (es passiert nichts), verhindert das Setzen eines Objektzeigers auf Nil, dass etwas Schlimmes passiert, wenn dem Objekt eine Nachricht gesendet wird, nachdem es freigegeben wurde.

0voto

Donnie Punkte 43338

Zusätzlich zu den anderen Antworten ist es in vielen Sprachen üblich, freigegebene Objekte auf nil besonders wenn die Objekte nicht vollständig lokal sind (vielleicht Mitglieder eines anderen Objekts). Auf diese Weise können Sie leicht überprüfen, ob ein Objekt bereits freigegeben wurde, so dass Sie es bei Bedarf erneut erstellen können.

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