UILabel(CALayer)在ARC中泄漏?

3

我遇到了一个问题,在几天内查看了许多答案。我的问题是,当我选择“配置文件>泄漏”在Xcode中时,我发现UILabel(CALayer)的Live Bytes一直在增加。这是正常的还是有泄漏?我该怎么办?当我更改类并返回具有这些标签的类时,它会不断变大。就像它们一遍又一遍地分配,但没有释放旧的。

我在头文件中设置了我的标签如下:

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

and ,

- (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,那么您不需要这样做,但是当您的控制器收到内存警告时,您需要释放/重新加载。 - Jacek Grygiel
@fenk,没有警告,我已经清理了它们,但是在Xcode的仪表板部分标签变得越来越大。我不知道这是否是泄漏或其他问题。顺便说一句,谢谢你的回复。 - Yucel Bayram
你正在使用 ARC 吗?如果是的话,你不需要做 self.lbl.... = nil; 如果你没有使用 ARC,那么你不应该在 viewDidUnload 中这样做,而是应该在 dealloc 中完成。但我建议你转向使用 ARC,因为苹果公司真的开始推动开发者使用它了,而且在我看来,它使生活变得更加轻松。 - Popeye
@Popeye 是的,我使用ARC。 - Yucel Bayram
不需要这样做。您的标签对象将自动释放,这就是“ARC”的目的,它是一种自动内存管理系统。 - Popeye
谢谢,我同意这一点,但你有没有想法为什么它在个人资料中看起来越来越大? - Yucel Bayram
2个回答

2
“viewDidUnload”在iOS6及以后版本中已弃用
可能你想要这样做:
- (void)dealloc
{
    _lblNumbersSpelling1=nil;
    _lblNumbersSpelling2=nil;
    _lblNumbersSpelling3=nil;
    _lblNumbersSpelling4=nil;
    _lblRecordSayfasiNot=nil;
}

1
由于用户现在指示他们正在使用ARC,因此当使用ARC时,永远不会调用dealloc,因此他们将无法使用dealloc。@yucelbayram我刚刚使用xcode 5进行了检查,你是对的,即使它肯定已被弃用,也没有弃用警告。我还在xcode 5之前的版本中进行了检查,它确实有弃用警告,这可能是xcode 5中的错误,但请相信ProFFeSSor提供的文档,它肯定已被弃用。 - Popeye
5
在ARC下,dealloc方法确实会被调用。您不能自己调用它或调用super,但dealloc仍然会执行。 - jrturton
5
错误。在使用ARC编译的代码中,您可以并且在许多情况下必须重写dealloc方法。但是,在ARC下实现的dealloc方法不能调用[super dealloc]。如果您的dealloc方法未被执行,则您的对象可能已泄漏(或无限期地缓存)。 - jlehr
对不起,请忘记[super dealloc]。谢谢您的评论! - NSDmitry
1
根据在https://dev59.com/OWUq5IYBdhLWcg3wbv9Z上选择的答案,我认为在这种情况下根本不需要dealloc方法。 - Popeye
显示剩余5条评论

2
我在使用Xcode的分析工具时遇到了与UILabel(CALayer)内存使用增加的相同问题。最终,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/

我在几个项目中遇到了这种情况,对于第一和第二个我很确定。但第三和第四个有道理。谢谢,我会在下次尝试并告诉你结果。 - Yucel Bayram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接