2009-09-13 12 views
15

オブジェクトを解放した後、ポインタをnilに設定するのが最善でしょうか?それは私がやっていることです、ちょうどその必要な、良い練習か過度のことを尋ねたかったのですか?リリース後にnilへのポインタを設定しますか?

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

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

歓声は、それは良い習慣と考えられてい

答えて

20

ポインタを保持する変数のスコープに依存が起こることはありません。スコープ内に変数が存在し続ける場合は、常にポインタをnilに設定します。そうしないと、現在リリースされているオブジェクトを含むメモリ位置にアクセスする危険性があります。

しかし、変数が有効範​​囲外になった場合は、どちらも使用されません。そのため、nilにビットを過度に割り当てる必要があります。それでも、誰かがあなたのコードにコードを追加することを決めたときに、その変数をその範囲内で誤って使用することにしたときに、それが解放された後にnilを代入するのは良い方法です。

+1

ありがとうございます。 – fuzzygoat

+0

私は、人々が最初にnilに設定してからリリースするコードをいくつか見てきました。その結果、何もしない[nil release]になります。注文が重要かどうか疑問に思っている人には、そうです! – pnizzle

1

を-gary-。ポインタを解放した後にポインタnilに設定した場合、後で実行時に変数を誤用すると、適切なエラーが発生します。

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でない場合は解放してください。メッセージをnilに送信するのは問題ありませんが、任意の迷惑メールには関係ありません。それは私にEXC_BAD_ACCESSを与えます。

関連する問題