Can't release unused CALayer memory when using multiple layers

≡放荡痞女 提交于 2019-11-28 05:29:17

问题


I am using multiple CALayer's in my application with large UIImage as contents. unfortunately, when I don't need the layer nor the image - the memory is not freed.

the code I use to create the layer is:

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)

the code I use to release the layer and it's contents is :

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

when I'm using the instruments memory profiler I see the real memory increasing when creating the layer but never decreasing when freeing there. I can't use release since I am using ARC. what do I do wrong here ?

Thanks.


回答1:


UIImage's imageNamed: method uses a static cache that is only released upon tight memory situations.

Your options are:

  1. Use -[UIImage imageWithContentsOfFile:] instead.
  2. Ignore the problem. The cache is cleaned up when a memory notification comes in.



回答2:


Just for documenting another answer. The image that I created in my code was drawn at runtime using CGImageCreateWithImageInRect. The produced object is CGImageRef. I simply forgot to release it using CGImageRelease causing the memory consumption to increase gradually and after 3 or 4 animation, the application crashes due to memory constraint.

Always release an CGImageRef.



来源:https://stackoverflow.com/questions/10494980/cant-release-unused-calayer-memory-when-using-multiple-layers

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!