Warum sollte ich [anView release] schreiben, anView = nil; anstatt [ANView-Version] ;?

7

Irgendwo habe ich das gelesen - in Bezug auf Warnungen bei niedrigem Speicher und das Aufgeben einer nicht sichtbaren Ansicht mit all ihren Subviews (= eine ganze Feder, glaube ich), sollten Sie das tun:

%Vor%

statt

%Vor%

Was ist der Grund dafür, diese Zeiger auf nil (= "no object") zu erden, nachdem ich die Freigabe gegeben habe? Lass mich raten: Eine andere Methode könnte die Ansicht aus irgendeinem Grund behalten haben (irgendjemand ein Beispiel dafür, wann das passieren könnte?), Dann passiert die didReceiveMemoryWarning-Sache und du veröffentlichst eine ganze Nib + -Ansicht, die momentan nicht sichtbar ist (d in einer Multiview-App). Sobald der Benutzer diese Ansicht wieder sehen möchte, würden Sie schnell die Feder wieder laden und dann: Es lädt alle Ansichten, verbindet die Ausgänge und BANG! Ihre anderen beibehaltenen Ansichten hängen jetzt ohne Zeiger irgendwo einsam im Speicherbaustein, was zu einem fetten und tiefen Speicherverlust führt, bis Ihre App abstürzt.

Richtig / falsch?

    
Thanks 30.04.2009, 08:25
quelle

5 Antworten

1

anstatt die expicit-Version zu machen und auf nil zu setzen, wenn Ihre Accessoren Eigenschaften haben, die mit yoc verknüpft sind, und das Folgende als prägnantere Methode verwenden:

%Vor%

Auf diese Weise können Sie Code mit weniger Wiederholungen erstellen, da der synthetisierte Code Ihre Releases für Sie übernimmt.

Edit: Ich sollte darauf hinweisen, dass Ihre Eigenschaften nicht gelesen werden können, sonst erhalten Sie Compiler-Fehler aus offensichtlichen Gründen:)

    
Kevlar 12.05.2009, 22:31
quelle
14

Das Prinzip ist allgemeiner als UIView. tatsächlich ist es allgemeiner als Objective-C / Cocoa -release Methode. Es ist auch gültig mit C malloc() / free() Speicherfunktionen.

Wenn Sie ein Objekt oder eine Speicherzone nicht mehr benötigen, geben Sie es zuerst frei. Um sicherzustellen, dass Sie es nicht erneut verwenden, löschen Sie die Zugriffsmethode für dieses Objekt oder diese Speicherzone, indem Sie einem Speicherzeiger nil oder einem Speicherzeiger NULL zuweisen.

    
mouviciel 30.04.2009 08:37
quelle
11
  

Eine andere Methode könnte die Ansicht aus irgendeinem Grund behalten haben

Wenn Sie dealloc nicht selbst aufrufen, wird es nur aufgerufen, wenn der Retain-Wert Null wird.

Beachten Sie, dass in Objective-C das Senden einer Nachricht an ein nil "object" (oft) völlig in Ordnung ist. Wenn Sie dies tun, wird nicht Ihr Programm anhalten, aber die Nachricht wird einfach ignoriert. Sie können jedoch keine Nachricht an ein freigegebenes Objekt senden, was zu einem Absturz führen würde.

Das folgende würde Ihnen also einen Fehler geben:

%Vor%

Aber das ist in der Tat in Ordnung:

%Vor%

Es ist eine Frage des Geschmacks, aber für die oben genannten, könnten Sie tatsächlich lieber Ihr Programm zum Absturz bringen, anstatt sich zu fragen, warum etwas nicht ausgeführt wird ...

Siehe auch Senden Nachrichten an nil aus Apples Einführung in die Ziel-C 2.0 Programmiersprache .

    
Arjan 30.04.2009 09:55
quelle
4

Die Methode -dealloc wird aufgerufen, wenn das Objekt freigegeben wird und danach keine anderen Methoden für das Objekt ausgeführt werden. Daher hat das Setzen einer Instanzvariable auf null keine Auswirkung außerhalb dieses Objekts.

Wenn Sie ein Objekt (ohne einen Setter) an einer anderen Stelle in der Klasse freigeben würden, wäre es wichtig, die Instanzvariable auf Null zu setzen, um Code an einer anderen Stelle zu verhindern, indem eine Nachricht an diese Adresse gesendet wird.

    
retainCount 30.04.2009 21:03
quelle
2

Ich benutze dieses Muster sehr:

%Vor%

So ziemlich überall, wo ich einen Viewcontroller zulasse, der modal oder sonst wie "temporär" ist. Auf diese Weise hängt es herum, wenn ich es wieder brauche, aber es geht weg, wenn der Speicher knapp wird.

    
Mark Bessey 30.04.2009 17:07
quelle