3

[[UIImage alloc] initWithContentsOfFile:path]

メソッドが画像を初期化できない場合は nil を返します。次のコードは、割り当てられた UIImage を解放していません。画像が[image release]行に nil であるためです。

UIImage* image = [[UIImage alloc] initWithContentsOfFile:path];
if(image)
{
....
}
//Here image is nil and not releases allocated UIImage.
[image release];

これは本当にメモリリークですか?

init が nil を返す場合、どのようにオブジェクトを解放する必要がありますか? UIImage* image = [[UIImage alloc] initWithContentsOfFile:path]; を行う場合

init が失敗するため、image は nil です。[image release] は [nil release] と同じです。エラーはありませんが、何も解放されていません。

4

2 に答える 2

1

この例の保持カウントは、画像が nil であるかどうかとは関係ありません。を使用して手動でイメージを割り当てました

UIImage* test = [UIImage alloc];

したがって、あなたがそのオブジェクトの唯一の所有者であるため、手動で解放するまで保持カウントは 1 になります。

このテーマの詳細については、メモリ管理規則を参照してください。

于 2011-07-05T10:00:30.860 に答える
0

releaseonnilは何もしないので、常に問題ありません。また、最初からオブジェクトがなかったので、漏れることはありません。

UIImage* test = [UIImage alloc];

testすでにUIImageそれ自体がオブジェクトです (ただし、この行で初期化に失敗しました)。

alloc/initは常に同じ行 (および同じ変数) で実行する必要があります。そうしないと、コード ロジックを理解するのが非常に難しくなります。コードは 1 つのオブジェクトのみを生成し、それを別の変数に割り当てます。

これは同じですが、より明確です。

UIImage* test = [[UIImage alloc] initWithContentsOfFile:path];
UIImage* image = test;
int n = [test retainCount]

testここで、とimageが同じオブジェクトであることは明らかです(したがって、 も同じretainCountです)。それらの 1 つを離すと、オブジェクトは消えます (retain以前に離した場合を除く)。

また、信頼したり、多くの仮定を立てたりするべきものでretainCountないことに注意してください。多くの場合、せいぜい誤解を招くだけです。

于 2011-07-05T10:07:54.540 に答える