2009-11-19 169 views
6

我經常看到當我們釋放ab對象時,我們立即將它設置爲零。我知道release和nil都釋放了與對象相關的舊值,但在釋放的情況下,它將對象作爲懸掛指針離開,因此我們必須將其設置爲零。我們爲什麼要放?

所以我的問題是如果nil釋放對象的舊值並將對象設置爲nil爲什麼我們不應該只使用nil爲什麼w也應該使用release。

WAY1:

MyClass *obj = [[MyClass alloc] init]; 
[obj release]; 
obj = nil; 

Way2:

MyClass *obj = [[MyClass alloc] init]; 
obj = nil; 

是什麼WAY1和way2真正的區別,如果使用WAY1爲什麼不只能用way2?

+1

很好的問題.. – tek3

回答

11

將指針設置爲零不會釋放該指針前一個目標占用的內存。用簡單的英文,將它分配給零,但是而不是釋放它。

如果您的應用程序是垃圾收集,釋放是一個空操作,可以省略。否則,這是非常非常必要的。因此,方式1總是正確的,而方式2僅在垃圾回收下才是正確的。

注意:此答案不適用於使用自動引用計數的項目。在ARC下,將指針設置爲無是否向對象發送版本。

+4

有一個明顯的例外在這裏:** **如果它是一個實例變量**和**它已被宣佈爲'@property(retain)'**和**你有'@ synthesis'訪問器,那麼這些訪問器方法將負責保留和釋放分配給它們的對象。當然,這隻適用於使用訪問器方法:'[self setObj:nil]'或'self.obj = nil'(在objc-2.0中)。 –

1

這是因爲BJ說將其設置爲零不會釋放內存,並且在非gc收集的環境中會導致內存泄漏。那會可能是有效的,以及另一種方法是

MyClass *obj = [[[MyClass alloc] init] autorelease]; 

obj = nil;