【问题标题】:Alternative to NSZombieNSZombie 的替代品
【发布时间】:2014-12-30 08:53:35
【问题描述】:

我正在尝试使用 NSZombie 调试 EXC_BAD_ACCESS 崩溃。我的应用程序创建了许多大型对象,并且启用了 NSZombie 后,它们没有被释放,导致应用程序在几秒钟内崩溃。这意味着我什至无法在应用程序因内存不足而崩溃之前导致 EXC_BAD_ACCESS 崩溃。

还有其他选择吗?我可以在特定文件而不是整个项目上启用 NSZombie 吗?我还能如何调试此崩溃(我知道它是由 UIGestureRecognizer 引起的,但我经常使用它们,因此它不会显着缩小问题范围)。

谢谢。

编辑: 谢谢你的建议。我想我可能已经解决了这个问题,并会在更多测试后报告。

编辑 2:我自己解决了这个问题,但选择的答案似乎是未来任何类似问题的一个很好的解决方案。

【问题讨论】:

  • 模拟器可以处理比真实设备更多的内存使用。可以在模拟器上试试吗?
  • @rmaddy 也没有运气。它分配了大约 100mb 的内存并崩溃了。
  • 如果您似乎遇到了僵尸问题,首先要做的是运行 Analyzer 并仔细处理产生的警告。它很有可能会找到您的问题。
  • @HotLicks 我想我可能已经解决了它!在确认之前要做更多的测试,因为它不容易重现。
  • @kmcgrady 在你的 dealloc 中,你可以用指向僵尸类的指针替换你的对象的 isa 来实现单文件僵尸检查。可能是。没试过。

标签: ios objective-c memory nszombie


【解决方案1】:

我能想到的只是手动实现它;创建一个代理容器,其中包含 id 类型的对象并将其命名为 -forwardingTargetForSelector: 并让它响应 -isKindOfClass: 等。

为代理禁用 ARC 并让它在 init 期间保留自己,并在指定转发目标时检查自己的 retainCount

如果计数为 1,则引发异常或记录警告等。

让可疑类将自己包裹起来并返回一个代理作为其单元的最后一行。

对于可能的奖励积分,请将[NSThread callStackSymbols] 存储在代理单元期间的某个位置(可能在磁盘上),这样您至少可以找出错误管理对象的创建位置。

【讨论】:

  • 非常有趣的想法。我现在要研究一下。
  • 幸运的是,我在您发布此内容后大约 15 分钟通过试错发现了该问题。我想对尝试实施它的恐惧刺激了我!好主意,谢谢。
【解决方案2】:

NSZombies 曾经/现在适用于使用自己的内存管理的应用。如果您的应用使用 ARC,那么这将无济于事。

新建断点:所有异常

这通常应该告诉你你在哪里触发了错误的访问。

【讨论】:

  • 谢谢,我现在正在尝试 - 你说得对,我正在使用 ARC。
  • 这不是真的。 NSZombies 非常适合与 ARC 一起使用。
  • 不幸的是,这没有帮助。异常断点没有更早地捕获它。
  • 在 EXC_BAD_ACCESS 的情况下设置异常断点无济于事。
  • NSZombie 可以在任何可能引用已释放对象的时候使用,这在 ARC 下是完全可能的。 ARC 并没有摆脱 retains/releases/allocs/deallocs/autoreleases,它只是为您添加它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
  • 2012-01-25
  • 2015-08-05
  • 2011-01-01
  • 2011-10-24
  • 2011-05-31
相关资源
最近更新 更多