2010-11-18 4 views
7

Wenn wir Speicher einer Klassenvariablen zuweisen, sollten wir sie freigeben oder in der Dealloc-Methode auf Null setzen? Was ist die beste Praxis?Release Vs nil - Best Practice

+0

können Sie klären, was Sie unter „Klassenvariable“? – ohhorob

Antwort

11

Best Practice:

[foo release]; // ensures that memory is released 
foo = nil; // ensures that there is no dangling pointer to released memory 

Andere Anmerkungen:

Wenn Sie eine Eigenschaft zuweisen erklärt, behalten

// in your .h 
@property (retain) MyObject *foo; 

// in your .m 
self.foo = bar; // bar is retained; whatever foo previously pointed at is released 

wird es freigeben, was es vorher hinwies an und behalten Sie das neue Objekt, das zugewiesen wird.

So können Sie verwenden:

self.foo = nil; 

und es wird freigeben, was foo auf hinwies. Jedoch wurde wenn Ihre Eigenschaft nicht deklariert wurde Retain Storage-Semantik, dies wird nicht implizit freigeben, worauf foo zeigte auf. Auch, wie Ryan darauf hingewiesen hat, kann eine Eigenschaft außer Kraft gesetzt werden, um Nebenwirkungen zu haben. Aus diesem Grund ist es am besten, um das Muster der immer mit folgen:

[foo release]; 

Um sicherzustellen, dass Sie nicht über einen baumelnden Zeiger auf freigegebenen Speicher haben, können Sie diese Follow-up mit:

foo = nil; 

Wenn Sie mit behalten Semantik nicht mit Eigenschaften, Sie Notwendigkeit zu lösen, was in den variablen gespeichert wurde:

[foo release]; 

EDIT: Auch die folgende Antwort auf eine andere Frage sehen, dass dies erklärt:

iPhone - dealloc - Release vs. nil

+2

Es ist sicherer, -release statt des Eigenschaften-Setter zu verwenden, da Setter außer Kraft gesetzt werden können, um Nebenwirkungen zu haben. Sie möchten nicht, dass Nebenwirkungen in Ihrer Dealloc-Methode auftreten. – Ryan

+0

Danke Ryan - Ich habe meine Antwort bearbeitet, um das zu reflektieren. – Greg

+0

Ausgezeichnet. Danke mein Herr!!! – Abhinav