【发布时间】:2011-09-07 14:25:53
【问题描述】:
仪器工具报告 CALayer 的内存泄漏。我有一个自定义类,UIViewController 的子类;在 viewDidLoad() 我用 CAGradientLayer 实例化一个视图并将这个视图作为当前视图的子视图插入,例如:
UIControl *view = [[[UIControl alloc] initWithFrame:CGRectMake(10, 10, 460, 220)] autorelease];
CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = view.bounds;
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor whiteColor] CGColor], (id)[[UIColor colorWithRed:0.85 green:0.85 blue:0.85 alpha:1.0] CGColor],nil];
gradient.startPoint = CGPointMake(0, 0);
gradient.endPoint = CGPointMake(1, 1);
[view.layer insertSublayer:gradient atIndex:0];
view.layer.masksToBounds = YES;
[view.layer setCornerRadius:5];
[self.view insertSubview:view atIndex:1];
当我在模拟器中运行代码时,一切都很好。但是,当我在设备(iOS 4.3.3)上运行它时,仪器工具会报告 CALayer 的泄漏。当我注释掉这段代码时,没有泄漏。 这里有什么问题?
编辑:我发现只有将子视图插入到具有滚动视图的视图中才会泄漏(因此我的带有渐变层的子视图插入到视图和滚动视图之间)。
【问题讨论】:
-
但是视图是自动释放的,不是吗?
-
请尝试
CAGradientLayer *gradient = [[[CAGradientLayer alloc] init] autorelease];。我真的不知道,如果这有帮助,但我不确定,如果[CAGradientLayer layer]给CAGradientLayer,但给CALayer。 -
vikingosegundo:我试过了,但还是一样。
-
代码本身没问题,应该不会泄露。您是否正在对视图及其图层进行任何其他操作?您正在使用 insertSublayer:atIndex: - 您能解释一下为什么会这样,而不仅仅是使用 addSublayer:?
-
marcus:我正在插入一个渐变正方形的子图层。我在 Interface Builder 中内置了视图,其中一些我正在“注入”渐变背景
标签: iphone ios memory-leaks calayer