2012-01-23 7 views
0

私はいくつかの場所でこのコードを見てきました。オブジェクトへのポインタをnilにするとどうなりますか?

XYZ *xyz = [[XYZ alloc] init]; 

代わり[xyz release]ののdeallocで。

人がself.xyz = nilを使用しました。

これはメモリリークを引き起こしませんか?

編集:私が最初に書いた通り、xyz = nilではありませんでした。self.xyz = nil、 これはプロパティでした。

答えて

3

はい、それはメモリリークでは、しかし、これはメモリリークではありません、あなたが見たかもしれないものは、実際にこのでしたか?

編集: が、それはメモリリークではありません、理由はビーイング、セッターはプロパティによって作成されたnewXyzがnilであるので、それは

- (void)setXYZ:(XYZ *)newXyz 
{ 
    [xyz release]; 
    xyz = [newXyz retain]; 
} 

次のようなものになるだろう、に保持送ります古いxyzがセッターによって解放されている間、何もしません。メモリはあなたが唯一の保持の特性のためにこれを行うと、あなたは、プロパティnilを割り当てた場合、古いものがリリースされ、ポインタがnilを指しているので、セッター(self.propertyToBeReleased=nilまたは[self setProPropertyToBeReleased:nil) を使用することができます

+0

はい、それらはプロパティでした。 –

+0

この詳細については、私の編集を参照してください –

+0

コードで清潔で明確な説明をありがとう。 –

2

これはプロジェクトの設定によって異なります。 ARCが有効になっている場合は、いいえ、問題はありません。ただし、プロジェクトでARCが有効になっていない場合は、メモリーリークに問題がある可能性があります。 XYZは、プロパティなど

@property (nonatomic, retain) XYZ* xyz; 

- (void)dealloc 
{ 
    self.xyz = nil; 
    [super dealloc]; 
} 

として宣言されている場合

+0

ありがとうございました。私はあなたの答えのARC becozについて知りに来たが、私の答えは実際にプロパティにwrtだった。 –

0

この場合には、適切に管理されています。

iVarsでは使用しないでください。データが漏れているだけなので(データは解放されませんが、そこへのポインタはありません)、もう解放できません。

+2

'xyz = nil;'は、 'xyz'がプロパティであっても、setterが呼び出されないため(setterが解放を担当しているため)、' self.'によって先行されない限り、依然としてリークを引き起こします。 – vakio

+0

はい、もちろん、私は私の答えを編集しました –

関連する問題