2012-03-30 2 views
0

ich bin ein bisschen verwirrt, wenn wir eine pointer freigeben oder nil auf den Zeiger verwenden, gibt es den Speicher frei. Aber was ist mit dem Zeiger selbst? es zeigt auf ein Objekt, das nicht mehr existiert, also wird der Zeiger automatisch entfernt? ist es implizit, dass dealloc sowohl den Speicher als auch den Zeiger selbst freigibt?Freigabespeicher und der Zeiger selbst? in objective-c

Dank

Antwort

3

Der Zeiger ist eine lokale Variable, die eine Adresse im Speicher darstellt, kein Objekt. Es gibt nichts zu veröffentlichen.

Zum Beispiel:

int i = 1; 
NSSomething *object = [[NSSomething alloc] init]; 

Sie haben nun zwei lokale Variablen in dem Stapel, ein vom Typ int und die anderen Typ pointer to NSSomething. Sie haben auch eine neue NSSomething Instanz im Heap. Wenn Sie einfach return jetzt, Ihre i und object Variablen werden außerhalb des Umfangs und verschwinden, aber die NSSomething Instanz in den Haufen wird für immer leben. Um dies zu vermeiden, müssen Sie release (oder autorelease) es vor Ihnen return von der Funktion.

+0

danke Radu, also könnten wir einen Zeiger haben, der nach nirgendwo zeigt, wenn wir dann diesen Zeiger benutzen, könnte es die App zum Absturz bringen, ist das korrekt? Normalerweise sehe ich nur die Retain/Release, ohne "Nil" auf den Zeigern zu verwenden, also frage ich mich, ob es ein kleiner Fehler ist oder ob es der normale Weg ist. – Paul

+0

@Paul, ja, das ist in der Tat eine "defensive Programmierung" -Technik. Wenn Sie den Zeiger auf Null setzen, stürzt die App nicht ab, wenn Sie einen Fehler machen, und versucht, sie zu verwenden, da das Senden von Nachrichten an ein freigegebenes Objekt zu undefiniertem Verhalten führt (= zufällige Abstürze, wenn Sie zumindest erwarten Sie es, in der Regel nach der Veröffentlichung der App). – rid

+0

danke, sollten wir immer noch "nil" im dealloc verwenden? Das Dealloc wird gestartet, wenn die App beendet wird. Was ist die Gefahr? – Paul

0

Der Zeiger selbst wird beim Zurückkehren vom Stack-Frame gelöscht (ähnlich wie der Assembly-Aufruf RET, eher wie die Stack-Klammern {}, die tatsächlich einen Stack-Frame öffnen und schließen).

Nichts, worüber Sie sich Sorgen machen müssen, wenn es um die Zeiger selbst geht. Wenn Sie wirklich möchten, können Sie den Zeiger zuweisen (als void *) und NULL setzen, nachdem Sie id * auf Null gesetzt haben. (Das sofortige Festlegen von NULL führt zu einem fehlerhaften Zugriffsfehler, wenn eine objective-c-Nachricht übergeben wird).

1

Der Zeiger zeigt immer noch auf die Adresse des Objekts, obwohl das Objekt freigegeben wurde. Im Allgemeinen möchten Sie den Zeiger auf Null oder ein anderes Objekt setzen, nachdem Sie das vorherige Objekt losgelassen haben, auf das es gezeigt hat. Wenn Sie objective-c-Eigenschaften verwenden, wird der mit der Eigenschaft verbundene Zeiger automatisch auf null gesetzt.

+0

danke, könnten wir 'nil' einfach mit dem Setzer verwenden, anstatt' release', so dass der Setzer sich darum kümmert, das Objekt loszulassen und den Zeiger auf Null setzt? In den wenigen Beispielen, die ich bisher gelesen habe, habe ich nur die Verwendung von "release" gesehen, aber nicht viel "nil" mit dem Setzer – Paul

+0

. Ich lasse das Objekt immer noch los und setze die Eigenschaft auf nil, aber Tage kenne ich einfach empfehlen, ARC zu verwenden – Otium

Verwandte Themen