【问题标题】:UILabel(CALayer) is leaking in ARC?UILabel(CALayer) 在 ARC 中泄漏?
【发布时间】:2013-12-18 03:57:39
【问题描述】:

我遇到了一个问题,几天来检查了很多答案。我的问题是当我在 Xcode 中选择 profile>Leaks 时,我看到 UILabel(CALayer) 在 Live Bytes 中总是越来越大。是正常的还是漏水?我该怎么办?当我改变班级并回到具有这些标签的班级时,它变得越来越大。就像他们一遍又一遍地分配但不释放旧的一样。

我在 h 中设置了我的标签。像这样的文件

@property(weak,nonatomic)IBOutlet UILabel *lblNumbersSpelling1;
@property(weak,nonatomic)IBOutlet UILabel *lblNumbersSpelling2;
@property(weak,nonatomic)IBOutlet UILabel *lblNumbersSpelling3;
@property(weak,nonatomic)IBOutlet UILabel *lblNumbersSpelling4;

和,

- (void)viewDidUnload
{
    [super viewDidUnload];

    self.lblNumbersSpelling1=nil;
    self.lblNumbersSpelling2=nil;
    self.lblNumbersSpelling3=nil;
    self.lblNumbersSpelling4=nil;
    self.lblRecordSayfasiNot=nil;
   // Release any retained subviews of the main view.
}

我这样做了,但我不确定我在 viewDidUnload 方法中所做的是否有必要。 我使用 Xcode 5。 提前致谢。

【问题讨论】:

  • 如果您使用 ARC,则不必这样做,但另外您需要在控制器中收到内存警告时释放/重新加载。
  • @fenk 没有警告,我清理了它们,但 Xcode 仪器部分的标签越来越大。不知道是漏电还是什么。顺便谢谢你的回复。
  • 你在使用ARC吗?如果是这样,您不需要使用self.lbl.... = nil; 如果您不使用ARC,那么您不需要在viewDidUnload 中执行此操作,它需要在dealloc 中完成,但我建议您改用@987654328 @Apple 真的开始推动开发人员使用它,我认为它也让生活变得更轻松。
  • @Popeye 是的,我确实使用 ARC。
  • 那么不需要这样做。您的标签对象将自动释放这是ARC 的目的,它是一个自动内存管理系统。

标签: objective-c memory-management uilabel automatic-ref-counting instruments


【解决方案1】:

我的应用程序遇到了同样的问题,UILabel(CALayer) 在 Xcode 的配置文件工具中增加了内存使用量。归根结底,UILabel(CALayer) 在内存中的增加最终是由另一个问题(特别是对委托的强引用)引起的内存泄漏的症状。

我会检查以下内容以确保另一个问题不会导致 UILabel(CALayer) 被保留:

  1. 使任何 NSTimers 无效
  2. 将所有观察者移除到 NSNotificationCenter
  3. 确保您在块中使用了对 self 的弱引用
  4. 确保所有委托属性都使用弱引用

来源:http://www.reigndesign.com/blog/debugging-retain-cycles-in-objective-c-four-likely-culprits/

【讨论】:

  • 我在几个项目中遇到过这种情况,我确定第一和第二。但第三和第四是有道理的。谢谢,下次我会试试这个,我会让你知道结果。
【解决方案2】:

viewDidUnloaddeprecated in iOS6 and later

可能你想这样做:

- (void)dealloc
{
    _lblNumbersSpelling1=nil;
    _lblNumbersSpelling2=nil;
    _lblNumbersSpelling3=nil;
    _lblNumbersSpelling4=nil;
    _lblRecordSayfasiNot=nil;
}

【讨论】:

  • 谢谢我正在检查它。奇怪的是 Xcode 没有给出任何关于 viewDidUnload 方法被弃用的警告!
  • 由于用户现在表明他们正在使用ARC,他们将无法使用dealloc,因为在使用ARC 时永远不会调用它。 @yucelbayram我刚刚使用xcode 5进行了检查,你是对的,即使它肯定已被弃用,也没有弃用警告。我还检查了 5 之前的 xcode 版本,它确实有弃用警告,这可能是 xcode 5 中的一个错误,但相信ProFFeSSor 提供的文档肯定已弃用。
  • @Popeye dealloc 确实在 ARC 下被调用。不能自己调用​​,也不能调用super,但是dealloc还是会执行。
  • @Popeye 不正确。您可以并且在许多情况下必须覆盖 ARC 编译代码中的 dealloc。然而,ARC 下的dealloc 实现不能调用[super dealloc]。如果您的 dealloc 方法没有被执行,那么您的对象可能已泄漏(或无限期缓存)。
  • 基于stackoverflow.com/questions/14501115/… 上选择的答案,我想说在这种情况下根本不需要 dealloc 方法。
猜你喜欢
  • 1970-01-01
  • 2012-12-09
  • 2014-11-22
  • 2012-04-03
  • 1970-01-01
  • 2012-05-17
  • 2010-10-23
  • 2012-09-14
  • 2012-10-05
相关资源
最近更新 更多