2010年6月26日土曜日

メモリ管理



UIImage* img1 = [[UIImage alloc] initWithContentsOfFile:imgPath1];
UIImage* img2 = [[UIImage alloc] initWithContentsOfFile:imgPath2];
NSLog( @"A cnt %d %d\n", img1.retainCount, img2.retainCount );
imageView1.image = img1; //img1はここでretainされる
NSLog( @"B cnt %d %d\n", img1.retainCount, img2.retainCount );
imageView1.image = img2; //im1はrelease img2はretainされる
NSLog( @"C cnt %d %d\n", img1.retainCount, img2.retainCount );
imageView1.image = nil; //img2がreleaseされる
NSLog( @"D cnt %d %d\n", img1.retainCount, img2.retainCount );
[img1 release]; //ここでretainCount 0となり解放(dealloc)される
[img2 release]; //ここでretainCount 0となり解放(dealloc)される

==========出力結果========================
A cnt 1 1
B cnt 2 1 ←セットしたimg1がretainされてる
C cnt 1 2 ←img1はreleaseされ、セットしたimg2がretainされる
D cnt 1 1 ←img2がrelease、両方ともセットする前に戻る
セットしたオブジェクトの参照を解きたければ、nilをセットするとよい。(セットした先のクラスがreleaseの面倒までみてくれる)


参考文献iPhoneSDK + ObjectiveCにおけるメモリ管理のはまりところ

0 件のコメント:

コメントを投稿