3

大きな UIImage をコンテンツとしてアプリケーションで複数の 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 を使用しているため、リリースを使用できません。ここで何が間違っていますか?

ありがとう。

4

2 に答える 2

6

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

オプションは次のとおりです。

  1. -[UIImage imageWithContentsOfFile:]代わりに使用してください。
  2. 問題を無視します。メモリ通知が届くと、キャッシュがクリーンアップされます。
于 2012-05-08T09:00:56.847 に答える
0

別の回答を文書化するためだけに。コードで作成した画像は、実行時にCGImageCreateWithImageInRect. 生成されるオブジェクトは CGImageRef です。メモリ消費量が徐々に増加する原因となるものを使用してリリースするのを忘れただけCGImageReleaseで、3 つまたは 4 つのアニメーションの後、メモリの制約によりアプリケーションがクラッシュします。

常にリリースしCGImageRefます。

于 2014-06-12T15:54:58.563 に答える