Hatena::Groupiphone-dev

iPhoneアプリ開発まっしぐら★ このページをアンテナに追加 RSSフィード

引っ越し後の日記はコチラです

tokoromのその他の日記

2010-04-04

autoreleaseで解放を遅延した場合の使用メモリ変化のグラフ

| 18:45 | はてなブックマーク -  autoreleaseで解放を遅延した場合の使用メモリ変化のグラフ - iPhoneアプリ開発まっしぐら★

で、release/autorelease周りのパフォーマンス計測を行いましたが、あとはautoreleaseで解放を遅延した場合の使用メモリを気にする必要がありそうです。


といっても特にひねる部分もなく、autoreleaseで解放を遅延したぶん使用メモリが増えていくというだけです。

前々回の検証でせっかくObjectAllocのスクリーンショットを撮ったのでメモ程度に貼りつけておこうと思います。


各矢印は、それぞれ前々回の検証で

  • ループ内で確保したオブジェクトに全てreleaseを適用した場合の使用メモリがMAXになった部分
  • ループ内で確保したオブジェクトに全てautoreleaseを適用した場合の使用メモリがMAXになった部分
  • ループ内で確保したオブジェクトにautoreleaseを適用するが、NSAutoreleasePoolを使って定期的に解放した場合で使用メモリがMAXになった部分

を示します。

f:id:tokorom:20100404183411p:image

このグラフは、確保するメモリ容量やNSAutoreleasePoolの解放の頻度によって全く変わってきますので、あくまでもイメージとして。

見てのとおり、autoreleaseで多くのオブジェクトの解放を遅延させればさせるほど使用メモリが膨大になっていきますので、

  • 何回も繰り返されるループの中で、ローカル変数に対してautoreleaseを使うことは避ける
  • autoreleaseを使ったコードを何度もループせざるを得ない場合には、NSAutoreleasePoolで適切な頻度で解放する

といったことに気をつけないと。。。というのを改めて感じた次第です。


※最後に、くどいかもしれませんが、

  • クラス変数のコンテナにaddしたあとのオブジェクト
  • Viewにaddしたあとのコントロール

など、releaseでもautoreleaseでもどっちみちそのオブジェクトが保持されたままの(参照カウンタが0にならない)ケースでは、autoreleaseに対するデメリットは見当たらないので積極的な利用をオススメします。