5

メモリに解放されませんCAKeyframeAnimationを削除:は、私は、画像のアニメーションを表現するためのImageViewの層にCAKeyframeAnimationを追加している

:私は呼んでアニメーションを開始したい

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"]; 
animation.values = arrayOfImages; 
[animation setRemovedOnCompletion:YES]; 
animation.delegate = self; 
[animation setValue:delegate forKey:@"AnimatedImageViewDelegate"]; 
animation.repeatCount = repeatCount; 
animation.fillMode = kCAFillModeForwards; 
animation.calculationMode = kCAAnimationDiscrete; 
[animation setValue:animationName forKey:@"name"]; 

animation.duration = duration; 
[self.layer addAnimation:animation forKey:animationName]; 
[self.layer setContents:[animation.values lastObject]]; 

アニメーションが終了したら、完全に削除してメモリを解放します。

[self.layer removeAllAnimations];  
[self.layer removeAnimationForKey:animationName]; 

これを実行し、Instruments-Activity Monitorを使用すると、完全なimageViewをリリースしない限りメモリは解放されません。

UIImageViewを破壊せずにアニメーションメモリを解放するにはどうすればいいですか?

+0

あなたはそれをautoreleasepoolに入れてみることができます – SAKrisT

答えて

0

オブジェクトをインスタンス化するために簡易メソッドを使用しています。したがって、オブジェクトが実際に解放される時点を制御することはできません。それ以上のコントロールを持ってするには、オブジェクトをALLOCし、それを自分でDEALLOCする必要があります。

インスタンスを作成します。

CAKeyframeAnimation *animation = [[CAKeyframeAnimation alloc] init]; 

その後アニメーションがあなたの削除行の後にコールを終了した後:

[animation release]; 
+0

'[CAKeyframeAnimation animationWithKeyPath:]'は、(命名規則に従って)オートレリースされたオブジェクトを返し、彼はそれを保持していないようです(少なくとも彼が提示したコード)彼は大丈夫です。代わりに 'alloc/release'を実行してもそれは変わりません。確かに、彼のコードから、私はすべてが絶対にうまくいっているので、問題は他の場所になければならないと言いたい。 – DarkDust

+0

オートレリースされたときにリリースされたときに彼はコントロールがありません。それは、ビューが破壊されたときにオートレリースされているように思えるので、少なくとも試してみる価値のあるもののようです。 –

+0

アニメーションのalloc/initとreleaseを実行しても、Activity Monitorを使用してもメモリは減少しません。したがって、自動解放または解放を使用してメモリの点で違いはありません。私がアニメーションの行にコメントした場合.values = arrayOfImages;アニメーションが表示されていないとメモリが増加しないので、私の問題は、アニメーションが終了すると、ImageViewをリリースしない限り、メモリはまったく解放されないということです。 – nano

0

まず、iOS 5プロジェクトの場合は、ARCがあなたのリリースを処理する必要があります。これは本当に素晴らしいです!

今、私は自分のプロジェクトで多くのアニメーションを使用し、ヒープ内で同様のバーストを検出しました。私の推測では、CAは内部的にアニメーション化されたものをたくさんキャッシュしています。これらのアイテムが実際にオートリリースされていることを確認するには、計測ツールで割り当てやリークのテストを設定し、次の操作を行うことをお勧めします。

  1. トリガーとアニメーションの状況を特定します。
  2. アニメーションが完了した後にヒープをマークします。
  3. オブジェクトを削除する必要がある別のビューに移動するようなものをトリガーします。
  4. 手順1-2-3の手順を必要な回数繰り返します。私は通常それを約10回程度行います。

これは基本的にアニメーション - マーク - アンドゥ - アニメーション - マークです。 CoreAnimationがオブジェクトを正しく自動リリースしている場合は、ヒープショットが0またはほぼ0に減少するはずです。この記事を見てみましょう。このようにテストする方法の詳細については

は:

http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/

+0

あなたの答えをありがとう。アニメーションが終了すると、ImageViewをリリースした場合に限り、ほぼ0に減少します。それをリリースしなければ、ヒープの成長はかなり高い(毎回40KBから800KBまで)。つまり、CoreAnimationは終了時に解放されません。 – nano

0

私はCAKeyframeAnimationとメモリについても同じ問題を抱えているとき、設定値=画像の配列。 そして、私が得る問題は、画像が[UIImage imagewithname:]によってインクルードされ、デフォルトでメモリにキャッシュされていることです。だから私の解決策は、[UIImage imageWithContentsOfFile:] が役に立ったと思っています。

関連する問題