gpt4 book ai didi

objective-c - 调用选择器时导致 "EXC_BAD_ACCESS"的原因是什么?

转载 作者:行者123 更新时间:2023-12-03 16:56:17 26 4
gpt4 key购买 nike

当在 Objective-C 中调用选择器,应用程序崩溃,导致调试堆栈指向选择器,这是什么原因?据我了解,这是由于内存错误造成的。但是,我将命令发送到的对象和参数(数组)都是有效的。我可以说出来,因为这两个对象在 Xcode 中鼠标悬停时会显示内存位置以及其他信息。

由于跟踪在这个选择器处结束,我很茫然。当堆栈指向具有有效对象参数的选择器时,我从未见过此错误。

此外,此选择器被频繁调用。它总是处理相同类型的对象,在我崩溃之前没有任何迹象表明异常行为。
这种崩溃很少发生,每 10 分钟或更短时间发生一次。

由于我是新手程序员,选择器内的代码可能有问题。我经常像这样比较对象指针:

if (thisObject.pointerToSomeObject == nil) { //do stuff...

我开始怀疑这是正确的 Objective-C 编程,但话又说回来,代码大部分时间都有效。有没有我不知道的极端案例?

附加信息:
我正在使用 cocos2d 版本 1.0.0,Xcode 4.1。在 iPad 模拟器上进行测试。

任何帮助表示赞赏,甚至相关调试文章的链接也会有所帮助。

编辑

发展:

指向选择器的默认调试线程出现错误访问错误可能意味着错误访问发生在该选择器的执行过程中。可以使用 NSZombies 打开进一步的调试以找到确切的行。

所以,在开启 NSZombies 之后,问题就更详细的暴露出来了。 (感谢@Lou Franco 的糟糕访问教程)

现在,什么会导致:
if ([thisZombie target] == nil)

评估 NO,但在访问 [thisZombie target] 中的整数时抛出错误访问? target是一个指向 NSObject 的指针(僵尸化)
else {

int diffx = [thisZombie x] - [[thisZombie target] x];
// ^^ ----- bad access here

** 编辑 2 **

语法或短路评估一定有问题:
if (!thisZombie.target && thisZombie.leader && !thisZombie.leader.dead)

thisZombie.leader.dead 停止线程:
"* -[Zombie dead]: 消息发送到已释放实例 0x2108f0"

我想我应该提到这个游戏有“僵尸”,不要与“NSZombie”混淆

因此,程序将“thisZombie.target”评估为“true”
但是当我访问“thisZombie.target.x”时,程序停止执行。

为什么?

编辑 3

嗨,大家好,
我想再次感谢大家的有用意见和建议。
我决定通过彻底改变我的僵尸跟随他们的领导者的方式来解决这个问题。

我仍然不知道什么会导致如上所述的评估,但不再需要答案。

最佳答案

我写这篇博客是为了帮助理解和调试 EXC_BAD_ACCESS

http://loufranco.com/blog/files/Understanding-EXC_BAD_ACCESS.html

为了方便

  • 运行构建和分析——你得到一个干净的构建吗?看看它在说什么,但你现在可以忽略泄漏问题——寻找向释放对象发送消息的问题
  • 使用 NSZombiesEnabled 运行——这使得对象永远不会被释放,如果消息被发送到一个 retainCount 为 0 的对象,就会报错。
  • 启用 Guard Malloc,然后使用特殊的 GDB 命令检查堆的完整性。问题是您需要在崩溃之前逐步完成并执行此操作才能找到真正的问题。尽管
  • 它可能会在更接近您的问题的其他地方崩溃

    编辑:根据您上面的信息。你释放了 thisZombie.leader ,但您没有将其设置为零。可能是你忘了让 thisZombie 保留它,所以它被提前释放了。

    如果有循环引用(僵尸指向领导者,领导者指向后面),这可能会很棘手。如果它不是循环的,请记住保留您设置属性指向的任何对象(如果您使用保留属性,则自动并记住始终使用属性语法)

    In Objective-C on iOS, what is the (style) difference between "self.foo" and "foo" when using synthesized getters?

    关于objective-c - 调用选择器时导致 "EXC_BAD_ACCESS"的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7031104/

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