CCMenu导致EXC_BAD_ACCESS错误,但我无法回溯我的代码

时间:2013-10-23 05:06:40

标签: ios objective-c xcode cocos2d-iphone nszombies

EXC_BAD_ACCESS我遇到cocos2d-iphone 1.0.1个问题。

我启用了NSZombies,希望在我的代码中看到我访问的对象不应该访问。

问题出现在CCMenu.m,此处:

-(void) ccTouchMoved:(UITouch *)touch withEvent:(UIEvent *)event
{
    NSAssert(state_ == kCCMenuStateTrackingTouch, @"[Menu ccTouchMoved] -- invalid state");

    CCMenuItem *currentItem = [self itemForTouch:touch];

    if (currentItem != selectedItem_) {
        [selectedItem_ unselected];   // <--- selectedItem_ is a zombie
        selectedItem_ = currentItem;
        [selectedItem_ selected];
    }
}

我可以观察到selectedItem_是一个僵尸。

这是CCMenu代码,而不是我的代码 - 我应该查看自己的代码。所以我看一下回溯:

enter image description here

这对我没有帮助:回溯没有达到我自己的代码。这是cocos2d-iphone代码。

我该怎么做才能解决这个错误?

1 个答案:

答案 0 :(得分:-1)

欧米茄,你应该小心所有权:

if (currentItem != selectedItem_)
        selectedItem_ = currentItem; // is plain wrong on non ARC mode.

您应该为selectedItem _

合成保留的setter
@property(nonatomic, retain) CCMenuItem* selectedItem;

...

@synthesize selectedItem;

然后使用setter assignement。不是普通的指针赋值。

self.selectedItem_ = currentItem;
// is actually kind of
// [selectedItem_ autorelease]
// selectedItem_ = [currentItem retain]