2010-12-27 8 views
1

私はこの方法に出くわした:リリース後にnilに設定するのはなぜですか?

-(void) someMethod { 
    NSMutableArray *anArray = [[NSMutableArray alloc] init]; 
    // Do stuff with anArray ... 
    [anArray release]; 
    anArray = nil; 
} 

は、必要に応じてnilに配列を設定していますか?
このコードでは、リリースメッセージを配列に送信することによって、配列の割り当てが解除されます。

答えて

5

この場合、変数anArrayが直ちにスコープから外れるため、キーストロークが無駄になります。

オブジェクトがそのオブジェクトを解放した後、変数がしばらくスコープ内に残っている場合は、誤って参照を外すと、簡単に見つけることができるので、良いアイデアです。EXC_BAD_ACCESSメッセージを送信すると無視されます(nil/0を返す以外は無視されます)。

+0

修正: '無視されません'、それはnilを返します。 –

+0

@Wayne Hartman:はい、私は怠け者でした。回答が修正されました。 – JeremyP

+0

+1 to-the-point回答 – viral

0

いいえ、必要ありません。
それはちょうど(ゾンビにメッセージを送信しないように)安全な理由
のためであり、あなたのIVARはreallocをするゼロであるかどうかをテストすることができます

[ivar release]; 
ivar=nil; 
... 
if (ivar==nil) { 
    ivar = [[NSObject alloc] init]; 
} 
[ivar setValue:@"toto"]; 
+0

はい、これをnilに設定しないと、== nil(時々必要な場合があります)をテストすることはできません。 – Jake

+0

ガベージコレクタを使用する場合は必須です。 – Arafangion

+1

@Arafangion:GCでは、 –

0

それは必要はありませんが、設定することが良い行動を検討しnilへのポインタがありません。

4

他にも言及したように、nilに設定すると、dealloc edオブジェクトを参照するとコードがクラッシュしなくなります。 deallocを参照するとEXC_BAD_ACCESSエラーが発生し、アプリがクラッシュします。 nilオブジェクトはメッセージが送信されるとnilを返しますので、アプリはクラッシュしません。

あなたが提供する例では、それがメソッドに含まれているので、nilは必要ありません。しかし、値がnilになるので、コード内の別の場所で使用すると予想される場合は、変数をnilにしたくないです。

関連する問題