gpt4 book ai didi

iphone - 有办法到达 "find mystery retains"...吗?

转载 作者:行者123 更新时间:2023-12-03 18:14:43 25 4
gpt4 key购买 nike

最近我正在修复某人的代码。有一个大类不会解除分配。您必须发布 5 或 6 个版本才能将其释放。

我仔细地翻遍了大类,最终找到了各种需要发布的东西。

这让我思考:必须有一些非常简单的方法来“查找”对象上的所有保留..我对吗?

那么,有没有一种简单的方法可以“找到对象上的所有保留”? XCode 或 Instruments 中是否有一个其他人都知道的按钮?

当你找不到这样的谜团时你会怎么做?

因此,在 iOS 世界中,如果有人知道“显示此对象上所有保留的来源” 按钮 - 谢谢!

附注请注意,没有泄漏,并且这个问题与泄漏完全无关。该对象只是“完全正确”不会释放。

<小时/>

稍后..

Fabio 真正令人惊叹的解决方案:

Fabio 为这个问题提供了一个令人震惊的解决方案。用九个字来说,就是:

-(id)retain
{
NSLog(@"%@", [NSThread callStackSymbols]);
return ([super retain]);
}

这在许多情况下都非常有用,并会带来许多其他有用的东西。法比奥,你可能每年永远为我节省了两个人周的工作量。谢谢!

顺便说一句,如果您刚刚开始处理这个问题并与输出作斗争,我发现通常会有许多具有“UINib instantiateWithOwner:”特征的 block 。看起来这些将首先出现,重要的部分将随之而来。

最佳答案

Instruments 可以向您显示应用中任何 Obj-C 对象的每个 malloc、release 和保留的调用堆栈,无需更改代码。当您使用 ARC 时它可以工作,但 fabio 的解决方案不是这种情况。

这对于寻找那些神秘的遗迹非常有用 - 例如当一个对象在应该释放的时候却没有释放时。

方法如下:

  • CMD + I(产品/简介)
  • 当仪器弹出时,选择“分配”(不是泄漏)
  • 您的应用应该可以运行。
  • 做任何能让你的谜团发生的事情。
  • 选择左侧面板上的“分配”工具。
  • CMD + 1 或选择右侧带有波浪的圆圈。在右下角的面板中,勾选“记录引用计数”选项。这很重要,否则只会记录 malloc 和 free。
  • 在列表右上角的搜索框中,输入类的名称(例如 BCMyObject)。
  • 这会过滤“统计信息”列表,以显示当前有多少个类实例处于事件状态。 #Persistent 列显示有多少实例处于事件状态。
  • 单击该行,然后单击类名称旁边的小箭头 ->。您将看到面包屑显示“统计 > 分配摘要 > BCMyobject”
  • 这会向您显示该类的所有实例(以及哪些实例是事件的)。
  • 选择一个实例,然后再次点击箭头(这次是地址)
  • 现在您将在面包屑中看到“统计 > 分配摘要 > BCMyObject > 历史记录:0xADDRESS”。
  • 每次对象被 malloc 保留或释放时都会列出。
  • 现在,在“记录引用计数”选项所在的左侧面板中,按看起来像一个带有与其连接的框的条形的图标,或按 CMD + 3 .
  • 选择其中一行,您将看到导致调用的完整调用堆栈

简单! (大约)

关于iphone - 有办法到达 "find mystery retains"...吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5587509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com