【发布时间】:2011-08-11 18:40:23
【问题描述】:
当在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)
评估否,但在访问[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]: message sent to deallocated instance 0x2108f0"
我想我应该提到这个游戏有“僵尸”,不要与“NSZombie”混淆
因此,程序将“thisZombie.target”评估为“true” 但是当我访问“thisZombie.target.x”时,程序停止执行。
为什么?
编辑 3
大家好, 我想再次感谢大家的帮助和建议。 我决定通过彻底改变我的僵尸跟随他们的领导者的方式来解决这个问题。
我仍然不知道什么会导致如上所述的评估,但不再需要答案。
【问题讨论】:
标签: objective-c ipad crash cocos2d-iphone exc-bad-access