【发布时间】:2011-08-01 01:05:04
【问题描述】:
最近我在修复某人的代码。有一个大类不会解除分配。您必须发布 5 或 6 个版本才能释放它。
我仔细翻遍了大类,最终找到了各种需要发布的东西。
这让我想到:必须有一些非常简单的方法来“找到”对象上的所有保留 ..我说的对吗?
那么,有没有一种简单的方法来“查找所有保留” 对象? XCode 或 Instruments 中是否有其他人都知道的按钮?
当你找不到这样的谜团时,你会怎么做?
所以在 iOS 世界中,如果有人知道 “显示该对象上所有保留的来源” 按钮 - 谢谢!
附注请注意,没有泄漏,而且这个问题与泄漏完全无关。对象只是“完全正确”不会释放。
稍后..
Fabio 真正令人惊叹的解决方案:
Fabio 为这个问题提供了一个惊人的解决方案。九个字,就是:
-(id)retain
{
NSLog(@"%@", [NSThread callStackSymbols]);
return ([super retain]);
}
这在许多情况下都非常有用,并导致许多其他有用的事情。法比奥,你每年可能永远为我节省了两个人周的工作时间。谢谢!
顺便说一句,如果您刚刚开始掌握这一点并在输出中苦苦挣扎,我发现通常会有很多块具有“UINib instantiateWithOwner:”。看起来那些会先出现,重要的部分会紧随其后。
【问题讨论】:
-
当然
CADisplayLink会保留对象。 The documentation says so:“新建的展示链接保留了目标。”要使保留消失,您必须invalidateCADisplayLink。 -
有趣、重要的问题 (+1)。最好的是第一句话;-)
-
这在 ARC 下不起作用。你不能调用[super retain]。
-
"在 ARC 环境中,您需要先将 -fno-objc-arc 添加到编译器标志,以允许您覆盖保留并调用 super"
标签: iphone memory-management xcode4 retain