質問
この擬似コードを検討してください:
// an image is initialized
UIImage *imagePX = [[UIImage alloc]initWithContentsOfFile:... bla bla
imagePX = [self rotateImage:imagePX]; //A
[self doStuff:imagePX]; //B
次に、rotateImageメソッドがあります:
- (UIImage*) rotateImage:(UIImage*)source {
... rotate the image... draw on context...
[source drawInRect... bla bla
...
UIImage *rotatedImage = UIGraphicsGetImageFromCurrentImageContext();
return rotatedImage;
}
私の質問は、imagePXがリリースされたことがないことです。画像はメソッドRotateImageに渡されるので、コマンドで[source drawInRect ...]を使用した後、メソッドでrotateImageを返すので、それを単純に解放できると思いましたが、そうすると、プログラムは行Aが評価できるように変数imagePXが存在する必要があるため、クラッシュします。
他の問題は、画像がBで別のルーチンに転送されることです。それでは、imagePXの追跡を失い、リークすることなく動作させるための最良の方法は何ですか?
最善のアプローチは何ですか?
解決
代わりに
[[UIImage alloc]initWithContentsOfFile:... bla bla
使用
[UIImage imageWithContentsOfFile:...bla bla
後者は自動リリースされます。
他のヒント
UIImageのインスタンスを割り当てる必要はありません。 imageWithContentsOfFile
は静的メソッドであり、クラス自体で呼び出すことができます。
imageWithContentsOfFile
には、返されるオブジェクト(慣例により、 alloc
、 new
、または copy
という用語が含まれていないため) )は保持されず、自動解放プールの最初の排出時に自動解放されます。
逆に、このオブジェクトにアクセスしようとしたときにEXC_BAD_ACCESSエラーを受け取った理由がわからないという同様の状況に遭遇した場合は、おそらくすぐにリリースされます。そのような場合、このクラスの範囲内で手動の保持/解放を行います。
[UIImage imageNamed:@""]はどうですか?割り当てなし、解放する必要なし)
所属していません StackOverflow