【问题标题】:iOS CALayer memory leak only on deviceiOS CALayer 内存泄漏仅在设备上
【发布时间】: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


【解决方案1】:

释放 uiview 和 层 因为模拟器在系统配置中运行所以不会出现问题 但是与系统相比,设备的内存更少

【讨论】:

  • viewgradient 都是自动释放的。
  • [CAGradientLayer layer] 是一种方便的方法。并且应该自动发布。
  • 你怎么说 [CAGradientLayer 层] 是自动释放的
  • 它是一个类方法,就是创建一个新对象,但它的名字不是以alloc、init或copy开头的。所以按照规则,它必须返回一个自动释放的对象。
  • 来自Memory Management Programming Guide: Basics:许多类提供了+className...形式的方法,您可以使用这些方法来获取该类的新实例。通常被称为“便利构造函数”,这些方法创建一个类的新实例,初始化它,然后返回给你使用。您不拥有从便捷构造函数或其他访问器方法返回的对象。
猜你喜欢
  • 1970-01-01
  • 2011-08-20
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 2021-02-18
  • 2012-02-18
  • 1970-01-01
相关资源
最近更新 更多