NSZombie的替代方案

5
我正在使用NSZombie来调试EXC_BAD_ACCESS崩溃。然而,我的应用程序创建了许多大对象,在启用NSZombie后,这些对象没有被释放,导致应用程序在几秒钟内崩溃。这意味着我甚至无法引发EXC_BAD_ACCESS崩溃,因为应用程序由于低内存而崩溃。
有没有其他替代方法?我可以在特定文件上启用NSZombie,而不是整个项目吗?还有什么其他方法可以调试此崩溃(我知道它是由UIGestureRecognizer引起的,但我经常使用它们,所以并没有明显缩小问题范围)。
谢谢。
编辑:感谢建议。我认为我可能已经解决了这个问题,并将在更多测试之后报告。
编辑2:我自己解决了这个问题,但选择了看起来是未来解决类似问题的好方法的答案。

2
模拟器可以处理比实际设备更多的内存使用。你可以在模拟器上试试吗? - rmaddy
@rmaddy,这个也没有运气。它分配了大约100MB的内存并崩溃了。 - user470763
如果你似乎在处理僵尸进程时遇到了问题,首先要做的是运行分析器并仔细地处理产生的警告。它很有可能会找到你的问题。 - Hot Licks
@HotLicks 我想我可能已经解决了它!不过在确认之前还要进行更多的测试,因为它不容易复现。 - user470763
在你的dealloc中,你可以尝试用指向僵尸类的指针替换对象的isa,以实现单文件僵尸检查。也许可以。我还没有尝试过。 - bbum
2个回答

2
我所能想到的是手动实现它;创建一个代理容器,其中包含一个类型为id的对象,并将其指定为-forwardingTargetForSelector:,并使其响应于-isKindOfClass:等。
禁用代理的ARC并在init期间保留自身并检查其自己的retainCount,当提名转发目标时。
如果计数为1,则引发异常或记录警告或其他操作。
让可疑类在其单元的最后一行包装自己并返回代理。
对于可能的奖励分数,请在代理单元期间将[NSThread callStackSymbols]存储在某个地方(可能在磁盘上),以便您至少可以找出错误管理对象的创建位置。

非常有趣的想法。我现在要深入研究一下。 - user470763
幸运的是,你发帖后大约15分钟,我通过试错找到了问题所在。我想尝试实现它的恐惧激励了我!不过这是个好主意,谢谢你。 - user470763

-3

NSZombies是针对使用自己内存管理的应用程序的。如果您的应用程序使用ARC,则此方法无法帮助您。

创建一个新断点:所有异常

通常这样可以显示您触发错误访问的位置。


谢谢,我现在正在尝试 - 你说得对,我正在使用ARC。 - user470763
1
这是不正确的。NSZombies在ARC中使用是完全可以的。 - Nikolai Ruhe
很遗憾,这并没有起到帮助作用。异常断点没有更早地捕获它。 - user470763
1
设置异常断点在 EXC_BAD_ACCESS 的情况下无济于事。 - Nikolai Ruhe
NSZombie可以在任何可能引用已释放对象的情况下使用,这在ARC下是完全可能的。ARC并没有摆脱保留/释放/分配/释放/自动释放,它只是为您添加了这些操作。 - Morgan Chen

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