UIImageViewのメモリ累積によるメモリリークを解決し、ソースコードの修正を行ったのですが、依然としてメモリから開放されない画像があることを発見してしまいました。
そうでした、CALayerを使ったほうが処理が速いと知って、一部、CAKeyframeAnimation を使ったアニメーションを行っていたのを記憶の中から抹殺していたようです。
こいつもガッツリと強参照なので解放しなければいけません。そうそう、前回の記事では強参照かどうか調べる方法を書いていませんでしたね。実はそんなに難しくはありません。ドキュメントを見ればOKです。
ドキュメントはXcodeから気軽に開けます。HelpのDocumentation and API Reference をクリックします。
アドレスバーに【CALayer】と入力するとクラスの説明にたどりつけます。あとは contents プロパティの説明を探して確認。
@property(retain) id contents
とかかれていますね。 @property(retain) は __strong と同意ということなので強参照となります。
CAKeyframeAnimation の values は
@property(copy) NSArray *values
と定義されており、 copy も __strong となるために強参照となります。
では、解放の仕方です。
CALayer をインスタンス化していた変数を calayer
CAKeyframeAnimation をインスタンス化していた変数を cakeyframeanimation
とし
view というUIView でアニメションさせていた場合、
1 2 3 4 5 6 7 8 |
calayer.contents = nil; calayer = nil; cakeyframeanimation.values = nil; cakeyframeanimation = nil; view.layer.sublayers = nil; [view removeFromSuperview]; |
とすることで画像をスッキリと解放できます。CABasicAnimationでも同じだと思います。
画像の読み込みには SAUtility pathForResource:を使用しています、UIImageViewからUIImageを解放するをご確認ください。
みなさんも快適なアプリ開発ライフをお過ごしください。
おわり
コメント