按钮上的对象过度释放

时间:2012-05-31 09:36:48

标签: ios memory-leaks cocos2d-iphone release

这个问题让我困惑了好几天了。我有一个NSString,'spriteType'。它是使用属性和合成方法声明的。在我创建字符串的图层中,我还创建了一个CCNode。节点是在方法中创建的。

- (void) spritePick {

CCMenuItemImage *go = [CCMenuItemImage itemFromNormalImage:@"button_go.png" selectedImage:@"button_go_selected.png" target:self selector:@selector(test)];
spritePickMenu = [CCMenu menuWithItems:go, nil];
spritePickMenu.position = ccp(0,0);

spritePick = [CCNode node];
[spritePick addChild:spritePickMenu];
spritePick.position = ccp(240,160); 
[self addChild: spritePick];
}

从按钮调用的'test'方法很简单:

- (void) test {
NSLog(@"%@",spriteType);
}

NSLog行崩溃我的游戏,并提供错误:EXC_BAD_ACCESS

除了'test'方法之外的任何地方,代码都可以正常工作。为什么在从Node调用该方法时会给我错误,但是当它从其他地方调用时它不会给我?

如果需要,我可以给你完整的代码。

1 个答案:

答案 0 :(得分:1)

您在spriteType属性声明中使用了哪些属性?

如果您的项目使用ARC,标题应如下所示:

@property (nonatomic, strong) NSString *spriteType;

虽然实现应该如下:

@synthesize spriteType = spriteType_;

如果你以这种方式声明/合成你的属性,那么NSLog(@"%@", self.spriteType)只是写(null)到控制台(我测试要仔细检查)。

使用self.访问您的媒体资源是一种很好的做法,而不是直接尝试访问支持ivar。

由于您看到EXC_BAD_ACCESS,我认为您没有保留对self.spriteType.的强引用

如果您的项目使用ARC,则需要确保使用LLVM 3.0或更高版本进行编译,详细内容为in this answer.

相关问题