2009-09-13 70 views
15

釋放對象後最好是將指針設置爲零?那就是我一直在做的,只是想問一下它的必要,好的做法還是矯枉過正?發佈後設置指針爲零嗎?

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

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

歡呼-gary-

回答

20

取決於包含指針變量的範圍。如果它們繼續存在於範圍內,我總是將指針設置爲零,以防萬一我再次在其他地方調用該變量。否則,我有可能訪問包含一個現在被釋放的對象的內存位置。

但是,如果變量超出範圍,那麼它也不會被使用,因此賦值爲零有點矯枉過正。儘管如此,爲了防止別人決定將代碼添加到代碼中並偶然在該作用域內但在釋放後再次使用該變量,最好指定nil是一個好習慣。

+1

謝謝,非常感謝。 – fuzzygoat 2009-09-13 22:25:35

+0

我已經看到一些代碼,其中人們設置爲零然後釋放。這導致[無釋放],它什麼都不做。所以對於那些想知道訂單是否重要的​​人來說,是的! – pnizzle 2015-02-27 06:55:50

1

它是好的做法。如果您在釋放它們後將指針設置爲,那麼萬一您在稍後的執行階段誤用了您的變量,則會得到適當的錯誤。

6

通常當在C/C++中編程時,我將它設置爲null。爲什麼?因爲即使釋放指向的內存,指針仍然保存着釋放內存的地址。它可能會導致代碼嚴重的訪問衝突的問題是這樣的:

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

如果您曾將指針爲null,這絕不會發生

0

有時,這可能是至關重要的,因爲我剛剛發現。我在我的遊戲中使用了一個相機,它保持了一個指向通用目標的指針。如果你從一個關卡返回到主菜單,它將從內存中清除關卡,但保留相機和遊戲圖層。

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

由於相機會存在長於目標,最好設定目標爲nil,否則當再次水平荷載並設置一個新的目標:

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

它會崩潰上如果目標是垃圾而不是零,則釋放。向nil發送消息很好,但不適用於某些任意的垃圾內存。這給了我一個EXC_BAD_ACCESS