私はいくつかの場所でこのコードを見てきました。オブジェクトへのポインタをnilにするとどうなりますか?
XYZ *xyz = [[XYZ alloc] init];
代わり[xyz release]
ののdeallocで。
人がself.xyz = nil
を使用しました。
これはメモリリークを引き起こしませんか?
編集:私が最初に書いた通り、xyz = nil
ではありませんでした。self.xyz = nil
、 これはプロパティでした。
私はいくつかの場所でこのコードを見てきました。オブジェクトへのポインタをnilにするとどうなりますか?
XYZ *xyz = [[XYZ alloc] init];
代わり[xyz release]
ののdeallocで。
人がself.xyz = nil
を使用しました。
これはメモリリークを引き起こしませんか?
編集:私が最初に書いた通り、xyz = nil
ではありませんでした。self.xyz = nil
、 これはプロパティでした。
はい、それはメモリリークでは、しかし、これはメモリリークではありません、あなたが見たかもしれないものは、実際にこのでしたか?
編集: が、それはメモリリークではありません、理由はビーイング、セッターはプロパティによって作成されたnewXyzがnilであるので、それは
- (void)setXYZ:(XYZ *)newXyz
{
[xyz release];
xyz = [newXyz retain];
}
次のようなものになるだろう、に保持送ります古いxyzがセッターによって解放されている間、何もしません。メモリはあなたが唯一の保持の特性のためにこれを行うと、あなたは、プロパティnilを割り当てた場合、古いものがリリースされ、ポインタがnilを指しているので、セッター(self.propertyToBeReleased=nil
または[self setProPropertyToBeReleased:nil
) を使用することができます
これはプロジェクトの設定によって異なります。 ARCが有効になっている場合は、いいえ、問題はありません。ただし、プロジェクトでARCが有効になっていない場合は、メモリーリークに問題がある可能性があります。 XYZは、プロパティなど
@property (nonatomic, retain) XYZ* xyz;
- (void)dealloc
{
self.xyz = nil;
[super dealloc];
}
として宣言されている場合
ありがとうございました。私はあなたの答えのARC becozについて知りに来たが、私の答えは実際にプロパティにwrtだった。 –
この場合には、適切に管理されています。
iVarsでは使用しないでください。データが漏れているだけなので(データは解放されませんが、そこへのポインタはありません)、もう解放できません。
'xyz = nil;'は、 'xyz'がプロパティであっても、setterが呼び出されないため(setterが解放を担当しているため)、' self.'によって先行されない限り、依然としてリークを引き起こします。 – vakio
はい、もちろん、私は私の答えを編集しました –
はい、それらはプロパティでした。 –
この詳細については、私の編集を参照してください –
コードで清潔で明確な説明をありがとう。 –