为啥 `-[UILabel setText:]` 会泄漏?

Posted

技术标签:

【中文标题】为啥 `-[UILabel setText:]` 会泄漏?【英文标题】:Why Does `-[UILabel setText:]` Leak?为什么 `-[UILabel setText:]` 会泄漏? 【发布时间】:2011-01-12 18:38:55 【问题描述】:

在我的 iPad 应用程序的 ios 4.2.1 上的 UIScrollViewDelegate 类中,-scrollViewDidEndDecelerating: 方法调用了另一个方法,这样做:

EntryModel *entry = [entries objectAtIndex:index];
self.titleLabel.text = entry.title;

title 是 EntryModel 的非原子、保留的 NSString 属性。 titleLabel 是一个非原子的保留属性,带有一个 IBOutlet 将它连接到一个 nib 中定义的 UILabel。在 bbum 的blog post 之后,我一直在使用 Heapshot 分析,并将上述代码确定为泄漏。几乎每次我滚动到新页面时,titleLabel 都会泄漏一点:

如果我将第二行更改为:

self.titleLabel.text = @"Whatever";

泄漏停止:

我很困惑。 -[UILabel text] 在分配新值之前没有释放旧值吗?我假设不是,我一定做错了什么。为什么会泄漏?

【问题讨论】:

【参考方案1】:

也许您实际上并没有泄漏内存。您正在分配内存,因为 UILabel 上的 text 属性使用复制语义。因此,调用self.titleLabel.text 将在赋值的右侧创建 NSString 的副本。尝试使用 Leaks 工具运行以查看是否存在内存泄漏。

【讨论】:

Leaks 并不认为这是泄漏,但它显然是。我了解titleLable.text 将在分配时创建 NSString 的副本;但是为什么当一个新的值被分配给它(并复制)时它不释放它? 如果 Leaks 没有将其视为泄漏,您为什么认为它是泄漏?如果titleLable.text 没有正确释放字符串,Leaks 会称之为泄漏。 如果地址仍然可以访问,泄漏不会将其称为泄漏。它仍然可以访问并不意味着它也不是泄漏。废弃的内存是一个大问题(诸如只写缓存之类的东西)。见:friday.com/bbum/2010/10/17/…【参考方案2】:

鉴于您有零分配的 heapshot 代,这不是一致的内存增加。它可能是缓存[出错],或者可能是与滚动相关的泄漏,某些东西从事件的裂缝中掉了下来。

带有分配的 heapshot 迭代显示什么?

【讨论】:

相当多的东西。 CGPaths,<non-object>s,里面有各种各样的东西。 可能是缓存增加。可能是真正的泄漏。提交错误。

以上是关于为啥 `-[UILabel setText:]` 会泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 setText() 在 TextView 上的以下代码中不起作用?

为啥gui线程在槽中调用QLabel控件的setText方法响应慢?

为啥我的 UILabel 变量总是为零?

为啥我的 UILabel 的 AutoLayout 不起作用

为啥 UIStackView 不堆叠 UILabel 安排的子视图?

AutoLayout 适用于 UIView 但不适用于 UILabel。为啥?