为什么我的程序在给定负值时会崩溃?

时间:2010-03-20 20:02:30

标签: iphone objective-c cocos2d-iphone nsnumber

好吧,我很困惑,所以我希望你的朋友可以帮助我。我正在使用Cocos2D开发一个项目,这是最新版本(.99 RC 1)。我制作一些玩家物品和一些按钮来改变物体的生命。但奇怪的是,当我试图将生命改变-5时代码崩溃了。或者除了-1之外的任何负值。

直接前进,但是当NSnumber为-5时,它甚至没有被调用,它在NSlog语句中崩溃。那么......那是怎么回事?

通过更好地保留变量解决了这个问题。谢谢!

2 个答案:

答案 0 :(得分: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保持平衡。乍一看,你真的搞乱了内存管理。

答案 1 :(得分:1)

好吧,部分问题是您没有在任何地方使用“self.lifeChange”符号,这意味着您永远不会保留分配给lifeChange属性的NSNumber对象。这意味着NSNumber对象可能会随机死亡。

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