Einstellungen IBOutlets im Dealloc auf Null setzen

8

Im Abschnitt "Speicherwarnungen" finden Sie Ссылка Ich folge nicht, warum das IBOutlet im Dealloc auf Null gesetzt ist. Wenn

%Vor%

verursacht einen Absturz, wie im Thema erwähnt, warum setzen sie den ivar auf Null?

Im Allgemeinen, warum würden Sie einen ivar im Dealloc auf Null setzen, wenn Sie bereits Release aufrufen?

    
4thSpace 05.11.2009, 17:06
quelle

4 Antworten

12

Nach einem release ist der Zeiger im Wesentlichen ungültig und der erneute Zugriff kann einen Absturz verursachen. Indem Sie eine Variable auf nil nach release setzen, verhindern Sie, dass es zu einem Absturz kommt. Es gibt keinen Schaden beim Zugriff auf einen Nullzeiger.

Das Beispiel, mit dem Sie verlinkt haben, zeigt, warum es immer eine gute Idee ist, eine Variable oder einen ivar auf nil nach release zu setzen, auch wenn es so aussieht, als würde auf die Variable / ivar nicht mehr zugegriffen.

In diesem Beispiel wird auf die anOutlet -Ivar tatsächlich von der Oberklasse nach Ihrer dealloc -Methode zugegriffen. Wenn Sie sie also nicht auf null setzen, erhalten Sie einen Absturz. Szenarien wie diese sind nur schwer zu erkennen, wenn man sich den Code anschaut. Daher ist es eine gute Idee, jede Variable nach der Veröffentlichung zu löschen, selbst in dealloc.

    
Darren 05.11.2009, 17:50
quelle
1

Das Senden einer Nachricht zu einem freigegebenen Objekt verursacht einen Absturz, das Senden einer Nachricht an ein Nullobjekt wird ignoriert.

    
MarkPowell 05.11.2009 17:33
quelle
1

Manchmal ist ein Absturz eine gute Sache, und eine schnelle Lösung würde ein tiefer liegendes Problem verbergen. Wenn Sie eine freigegebene Variable aufrufen möchten, sollten Sie etwas wissen.

Das Buch iOS Recipes verweist auf dieses Problem:

  

Bereinigung in -dealloc
  Zusätzlich zur Freigabe aller relevanten Instanzvariablen in dem -dealloc setzen unsere Beispiele sie auf null. Diese Praxis ist eines der heiß diskutierten Themen unter den Cocoa-Programmierern, und beide Seiten des Arguments haben Gewicht. Dieses Buch ist nicht dazu gedacht, an der Debatte teilzunehmen: Wir setzen sie auf Null, aber das bedeutet nicht, dass Sie es müssen. Wenn Sie nil-in-dealloc nicht mögen, zögern Sie nicht, es aus Ihrem eigenen Code zu lassen.

Eine schnelle Google-Suche hat diesen Thread gefunden:
Ссылка

    
autodidakto 02.06.2011 03:29
quelle
0

Manchmal, wenn eine Eigenschaft ungültig wird (auf Null gesetzt), möchten wir auch andere Eigenschaften ungültig machen. Wenn eine Klasse eine Eigenschaft durch Verwendung von self.property_name = nil ungültig macht, wird eine Freigabemeldung gesendet, die zu einem Absturz in dealloc führt, wenn wir die Freigabe für diese Eigenschaft bereits aufgerufen haben. Wenn die Ungültigkeit in einer Oberklasse auftritt, ist dieser Fehler versteckt und ziemlich unangenehm. Wenn also eine Superklasse eine Eigenschaft ungültig macht, kann es sinnvoll sein, sie auf Null zu setzen und nicht nur aufzulösen.

    
Casebash 12.02.2010 01:21
quelle