2010-03-20 72 views
0

好吧,我很困惑,所以我希望你的朋友能帮助我。我正在使用Cocos2D(最新版本(.99 RC 1))开展项目。我制作了一些玩家对象和一些按钮来改变对象的生活。但奇怪的是,当我试图改变-5的生命时,代码崩溃。或者除此之外还有任何负值。为什么我的程序在给定负值时会崩溃?

直线前进,但是当NS编号为-5时,它甚至不会被调用,它会在NSlog语句中崩溃。那么......那是怎么回事?

通过更好地保留变量来解决它。谢谢!

+0

将来,不要粘贴如此长的代码段。以这种格式阅读几乎不可能。相反,把它放在pastebin或类似的网站并链接到它。 – TechZen 2010-03-20 20:28:00

回答

1

那么,你的问题的一部分是,你没有在任何地方使用记号“self.lifeChange”,这意味着你分配给lifeChange属性的NSNumber对象从不保留。这意味着NSNumber对象可能随机死亡。

更改为self.lifeChange,看看是否有帮助。

2

好的。我会再说一遍。访问者是你的朋友。使用它们。总是。注:是的,我知道Apple建议不要在init和dealloc中使用它们,但在15年内,它从来没有给我造成过问题,也没有使用它们。正如在这种情况下。有些时候,你不想使用它们,但这些时间远远小于时代你想使用它们)

在你buttonText方法:

- (void)buttonText:(int)number 
{ 
    lifeChange = [NSNumber numberWithInt:number]; 
    NSString *text = [[NSString alloc] initWithFormat:@"%d", number]; 
    CCLabel *label = [CCLabel labelWithString:text fontName:@"Times New Roman"          fontSize:20]; 
    label.position = CGPointMake(35, 20); 
    [self addChild:label]; 

} 

你应该做一个:

- (void)buttonText:(int)number 
{ 
    NSString *text = [[[NSString alloc] initWithFormat:@"%d", number] autorelease]; 
    CCLabel *label = [CCLabel labelWithString:text fontName:@"Times New Roman"          fontSize:20]; 

    [self setLifeChange:[NSNumber numberWithInt:number]]; 
    label.position = CGPointMake(35, 20); 
    [self addChild:label]; 

} 

看看你的代码,了解alloc/copy/retain如何与release/autorelease平衡。乍一看,你真的搞乱了内存管理。

+0

这是一个很好的观点,我会在将来确保更加谨慎。这只是一个小测试程序,所以对于真实的事情我会做得更好。谢谢! – 2010-03-20 20:44:00

+1

@Wayfarer - 良好的习惯最好由仪式使用强制执行。您在这个问题上浪费了多少时间,您可以通过遵循正确但繁琐的程序来节省这个问题? – TechZen 2010-03-20 20:54:47

相关问题