gpt4 book ai didi

ios - 如何调试 ARC 在不应该删除对象时删除对象

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:08:05 28 4
gpt4 key购买 nike

在我的 iOS 游戏(使用 ARC 编译)中有一个案例,其中一个对象(ivar,NSMutableDictionary)在发布版本中被删除,而它显然不应该被删除。在调试版本中,一切正常。

我正在尝试找出调试它的最佳方法。如果我对这个对象进行任何类型的检查,它就会像它应该的那样徘徊。我知道该对象正在被使用,因为应用程序崩溃,因此正在访问该对象。

我使用 Zombie 对象来告诉对象正在被删除,但我不知道它发生在何时何地。

有没有办法让我看到编译器何时认为不再需要此对象或何时实际删除它(如果它在自动释放池中,这可能不会告诉我任何信息)。

有没有人有好的建议来追踪这个?我不愿意将其称为编译器错误,但我看不出编译器怎么会认为不再引用该对象,因为它在所有地方都被引用了。保存 ivar 的对象是我所有代码运行的地方,因此它显然仍然存在(如果它不存在,将会发生更糟糕的事情)。

现在,我将只保留导致对象未被删除的那一行调试代码,但我讨厌将应用程序与该解决方案一起发布。

谢谢。

最佳答案

放置调试代码的地方是对象的dealloc 方法。您可以在此处放置一个断点(即使在 Release模式下)并查看它在什么时候消失。

最可能的原因是某些代码在 Release 中被重新排序或删除。

当您说“它在各处都被引用”时,您的意思是您的对象在其属性中持有对它的强引用吗?内存管理的第一条规则是保留(放入ivar)你关心的,释放你不再关心的。如果你有关心这个对象的对象,那么它们应该有一个指向它的强属性。如果他们这样做了,那么它肯定不会消失。


ARC 下的悬挂强指针表明您的代码中存在严重问题。我将从寻找您使用桥接 Actor 的任何地方开始(特别是 __bridge)。确保您没有将对象错误地传递给 void 指针。

注意 C 数组的任何使用。如果您离开 C 数组的末尾,那么您可能会破坏其他内存,从而导致此类问题。

类似地观察任何使用 length 参数的东西,例如 NSStringNSData。如果传递的值太长,则可能会超出数据末尾并破坏其他变量。类似地,任何通过 malloc 内存的原始指针。

关于ios - 如何调试 ARC 在不应该删除对象时删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9810105/

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