Почему происходит сбой моей программы при получении отрицательных значений? - PullRequest
0 голосов
/ 20 марта 2010

Хорошо, я очень смущен, поэтому я надеюсь, что вы, друзья, сможете мне помочь. Я работаю над проектом, использующим Cocos2D, самую последнюю версию (.99 RC 1). Я делаю объекты для игрока и кнопки для изменения жизни объекта. Но странно то, что код вылетает, когда я пытаюсь изменить их жизнь на -5. Или любое отрицательное значение по этому вопросу, кроме -1. ​​

Прямо, но когда NSnumber равен -5, он даже не вызывается, он падает в операторе NSlog. Итак ... что с этим?

Решил, сохранив переменную лучше. Спасибо!

Ответы [ 2 ]

2 голосов
/ 20 марта 2010

OK. Я скажу это снова. Accessors ваши друзья. Используй их. Всегда. ПРИМЕЧАНИЕ. Да, я знаю, что 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];

 }

Взгляните на свой код и поймите, как нужно распределять / копировать / сохранять балансировку с выпуском / автоматическим выпуском. На первый взгляд, вы действительно запутались в управлении памятью.

1 голос
/ 20 марта 2010

Что ж, отчасти ваша проблема в том, что вы нигде не используете нотацию self.lifeChange, что означает, что объекты NSNumber, которые вы назначаете свойству lifeChange, никогда не сохраняются. Это означает, что объект NSNumber может умереть случайно.

Измените на self.lifeChange и посмотрите, поможет ли это.

...