2009-09-13 3 views
15

Nach dem Freigeben von Objekten ist es am besten, die Zeiger auf Null zu setzen? Das ist was ich getan habe, wollte nur fragen, ob es notwendig, gute Praxis oder Overkill ist?Zeiger auf Null nach Freigabe setzen?

- (void)dealloc{ 
    [planetName release]; // NSString instance variable 
    [super dealloc]; 
} 
@end 

.

- (void)dealloc{ 
    [planetName release]; // NSString instance variable 
    planetName = nil; 
    [super dealloc]; 
} 
@end 

prost -gary-

Antwort

20

Abhängig vom Umfang der Variablen passieren wird, dass der Zeiger hält. Ich setze immer Zeiger auf Null, wenn sie im Gültigkeitsbereich weiterhin existieren, nur für den Fall, dass ich die Variable irgendwo anders wieder aufrufen werde. Andernfalls besteht die Gefahr, dass ich auf einen Speicherort zugreifen würde, der ein Objekt enthält, das jetzt freigegeben ist.

Aber wenn die Variable den Gültigkeitsbereich verlässt, wird sie ebenfalls nicht verwendet, daher ist die Zuweisung von Null zu wenig Overkill. Dennoch ist es eine gute Vorgehensweise, einfach nur Nil zuzuweisen, falls jemand anderes entscheidet, Code zu Ihrem Code hinzuzufügen, und die Variable versehentlich wieder innerhalb ihres Bereichs verwendet, aber nachdem sie freigegeben wurde.

+1

Vielen Dank, sehr geschätzt. – fuzzygoat

+0

Ich habe Code gesehen, wo Leute zuerst auf Null setzen und dann freigeben. Das führt zu [keine Veröffentlichung], was nichts bewirkt. Also für diejenigen, die sich fragen, ob die Reihenfolge zählt, ja, tut es! – pnizzle

1

Es ist gängige Praxis in Betracht gezogen wird. Wenn Sie nach der Freigabe die Zeiger auf nil setzen, erhalten Sie einen Fehler, wenn Sie Ihre Variable zu einem späteren Zeitpunkt der Ausführung missbrauchen.

6

Normalerweise, wenn ich in C/C++ programmiere, setze ich es auf Null. Warum? Selbst wenn Sie den Speicher freigeben, auf den verwiesen wird, enthält der Zeiger immer noch die Adresse des freigegebenen Speichers. Es kann eine ernsthafte Zugriffsverletzung Probleme in Code wie folgt führen:

if(myPointer != null) 
{ 
    doSomething(myPointer); 
} 

Wenn Sie Ihren Zeiger auf null gesetzt hatte, das nie

0

Manchmal kann dies entscheidend sein, wie ich gerade herausgefunden habe. Ich benutze eine Kamera in meinem Spiel, die einen Zeiger auf ein generisches Ziel hält. Wenn Sie von einem Level zum Hauptmenü zurückkehren, löscht es den Level aus dem Speicher, behält aber die Kamera- und Game-Ebenen.

-(void) dealloc { 
    [target release]; 
    target = nil; 
    [super dealloc]; 
} 

Da die Kamera länger existieren wird als das Ziel, ist es am besten Ziel zu null gesetzt, andernfalls, wenn die Ebene lädt wieder und Sie ein neues Ziel gesetzt:

-(void) setTarget:(CCNode *)aTarget { 
    [target release]; 
    target = [aTarget retain]; 
    [self update:0]; 
} 

Es auf, dass zum Absturz Freigabe, wenn das Ziel Müll ist und nicht Null. Es ist in Ordnung, eine Nachricht an nil zu senden, aber nicht an irgendeinen willkürlichen Junk-Speicher. Das gibt mir eine EXC_BAD_ACCESS.