2011-07-05 12 views
3

[[UIImage alloc] initWithContentsOfFile:path]initWithContentsOfFile:この方法は、画像を初期化することができない場合に戻る

戻りnilをnilをパス]メモリ管理。画像は[image release]ラインでnilであるとし、次のコードは、割り当てられたUIImageを解放されていません。

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];

イメージがnilであるため、 [image release]は[nil release]と同じです。さて、エラーはありませんが、何もリリースしていません。

答えて

1

この例の保持カウントは、イメージがnilであるかどうかとは関係ありません。手動で

UIImage* test = [UIImage alloc]; 

を使用して画像を割り当てられ、あなたはそのオブジェクトの唯一の所有者であるとして、あなたは手動で、それを解放するまで、したがって、保持カウントは1になります。

件名の詳細については、Memory Management Rulesを参照してください。

+0

はい、initがnilを返す場合、オブジェクトをどのように解放する必要がありますか? 私が行う場合 UIImage * image = [[UIImage alloc] initWithContentsOfFile:path]; [image release]は[nil release]と同じで、割り当てられたオブジェクトを解放していません –

+0

呼び出しに傷つくことはありませんが、リリースする必要はありませんとにかく画像が常にゼロになるとは限りません。オブジェクトが2つの全く異なるものとしてメモリを占有しているかどうかを判断するには、保持カウントを使用しないでください。これは私があなたが混乱していると思うところです。投稿したリンクをご覧ください。 –

1

releaseオンnilはノーオペレーションですので、常にokです。あなたが始めるべき物体を持っていなかったので、それは漏れません。

UIImage* test = [UIImage alloc]; 

test(あなたはこのラインでそれを初期化できませんでしたが)すでに独自にUIImageオブジェクトです。

あなたは本当にすべきです常に同じ行(および同じ変数)にalloc/initを実行してください - またはコードロジックは本当に難しいです。コードは1つのオブジェクトのみを生成し、それを別の変数に割り当てます。

より明確にかかわらず、これは、同じである:

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

ここではtestimageが同じオブジェクトである(したがって同じretainCountを持っている)ことは明らかです。それらのうちの1つを解放すると、オブジェクトは消えます(前にretainがない限り)。

また、retainCountではなく、であることに注意してください。それはせいぜい誤解を招くことがよくあります。

+0

私が言ったかったところ –

+2

alloc/initがnilを返した場合、解放する必要のあるメモリは残っていません。すべて順調。そしてnilでリリースを呼び出すことは痛いことではないので便利です。 – Eiko

関連する問題