2012-05-08 23 views
3

コンテンツとして大きなUIImageを持つアプリケーションで複数のCALayerを使用しています。残念ながら、私がレイヤーやイメージを必要としないとき - メモリは解放されません。複数のレイヤーを使用しているときに未使用のCALayerメモリを解放できません

私はレイヤーを作成するために使用するコードは次のとおりです。

UIImage *im = [UIImage imageNamed:@"image_1.jpg"]; 
CALayer * l = [CALayer layer]; 
[l setBounds:CGRectMake(0, 0, 1024, 768)]; 
[l setPosition:CGPointMake(512, 384)]; 
[l setAnchorPoint:CGPointMake(0.5, 0.5)]; 
[l setHidden:NO]; 
[l setContents:(id) im.CGImage]; 
[self.layer addSublayer:l]; // self is a subclass of UIView 
[self.tmpArr addObject:l]; // self.tmpArr contains the layers I am using (one in this example) 

私は層を解放するために使用し、それが内容のコードは次のとおりです。

CALayer * l = [self.tmpArr objectAtIndex:i]; 
[l removeFromSuperlayer]; 
[l setHidden:YES]; 
[l setContents:nil]; 
[self.tmpArr removeAllObjects]; 

私は楽器のメモリプロファイラを使用しています私は、レイヤーを作成するときに実際のメモリが増加するのを見るが、それを解放するときには決して減少しない。 私はARCを使用しているので、私はリリースを使用できません。私はここで何が間違っていますか?

ありがとうございました。

答えて

6

UIImageのimageNamed:メソッドは、厳しいメモリ状況でのみリリースされる静的キャッシュを使用します。

あなたのオプションは以下のとおりです。

  1. 利用代わりに-[UIImage imageWithContentsOfFile:]
  2. 問題を無視してください。キャッシュは、メモリ通知が入ったときにクリーンアップされます。
+0

ありがとうございます!最初の選択肢は私のアプリに大きな改善をもたらしました。 – Ulile

+0

こんにちはすべて、私はあなたがCALayerをよりよく理解していると私に気づきます。私はCALayer mallocの問題を投稿しています。もしあなたが見ていたら、私は非常に感謝しています... http://stackoverflow.com/questions/26715727/setneedsdisplay-drawrect-or-calayer-causing-dispatch-彼からの継続割り当て – Niall

0

もう1つの回答を文書化してください。私のコードで作成した画像は、実行時にCGImageCreateWithImageInRectを使って描画されました。生成されるオブジェクトはCGImageRefです。私は単にCGImageReleaseを使ってリリースするのを忘れていました。徐々にメモリ消費量が増え、3〜4回のアニメーションの後、アプリケーションはメモリ制約のためにクラッシュします。

常にCGImageRefをリリースしてください。

関連する問題