Сбой приложения iOS при запуске следующего кода

#iphone #objective-c #ios #xcode #xcode4

#iPhone #objective-c #iOS #xcode #xcode4

Вопрос:

Я новичок, создаю калькулятор, чтобы ознакомиться с ObjC.

Пока мой код работает нормально, за исключением следующего кода.

Эта функция связана с 5 кнопками.

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

 -(void) displayOnScreenValue{
[mainDisplay setText:onScreenTextValue];
}

-(void) pressOperatorButton:(id)sender{

    UIButton *pressedOpp = (UIButton *)sender;

    onScreenValue = [onScreenTextValue doubleValue]; //onScreenValue is Double

if (!opJustSet) {

    switch (opSelected) {
        case 0:  //Equal
            //mainDisplay.text = @"=";
            accuValue = onScreenValue;
            break;
        case 1:  //Plus
            //mainDisplay.text = @" ";
            accuValue = accuValue   onScreenValue;

            break;
        case 2:  //Minus
            //mainDisplay.text = @"-";
            accuValue = accuValue - onScreenValue;
            break;
        case 3: //Multiply
            //mainDisplay.text = @"x";
            accuValue = accuValue * onScreenValue;
            break;
        case 4: //Divide
            //mainDisplay.text = @"d";
            accuValue = accuValue / onScreenValue;
            break;

        default:
            break;
    }
    NSNumber* value = [NSNumber numberWithDouble:accuValue];
    onScreenTextValue =[value stringValue];
    [self displayOnScreenValue];
    opJustSet = YES;
    [value release];

}

signChangeSet = NO;
dotUsed = NO;
decimalValue = 0;
opSelected = pressedOpp.tag;

//[self displayOnScreenValue];
[pressedOpp release];
}
  

Ответ №1:

В этом коде:

 NSNumber* value = [NSNumber numberWithDouble:accuValue];
onScreenTextValue =[value stringValue];
[self displayOnScreenValue];
opJustSet = YES;
[value release];
  

Вы не должны освобождать значение. Вам нужно освободить только в том случае, если вы вызвали alloc, метод копирования
или если вы вызвали retain для него. Большинство сообщений возвращают объект, который будет автоматически выпущен.

То же самое относится и к этому

  [pressedOpp release];
  

удалите его — вы не выделили pressedOpp (или не сохранили его)

Кроме того, я не знаю, что такое onScreenTextValue , но, вероятно, это должно быть свойство @ с (сохранить). Если это так, вам нужно получить доступ следующим образом:

  self.onScreenTextValue = [value stringValue];
  

Чтобы получить автоматическое сохранение (в Objective-C self.name и имя — это не одно и то же: первый использует свойство, а второй — необработанный доступ к полю, который обходит сгенерированный установщик)

  1. Ознакомьтесь с семантикой подсчета ссылок

    http://www.loufranco.com/blog/files/managing-memory-iphone.html

  2. -или- Обновите до последней версии Xcode и используйте автоматический подсчет ссылок.

Еще одна простая вещь, которую нужно сделать, это всегда запускать «Сборка и анализ» и обязательно устранять каждую проблему. Он действительно хорош для поиска неправильных версий (фактически, этот же код стоит за автоматическим подсчетом ссылок)

Комментарии:

1. onScreenTextValue — это NSString . В настоящее время я использую Xcode 4.02 на SL. В настоящее время у меня нет никаких проблем с «Сборкой и анализом»

2. Добавление this.onScreenTextValue дает мне «использование необъявленного идентификатора «this»»

3. Спасибо, я просто удалил значение и нажал кнопку opp release, и все работает нормально. Еще раз спасибо

Ответ №2:

Вы неправильно управляете памятью. Например, код

 onScreenTextValue =[value stringValue];
  

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

Кроме того, вы выпускаете value , который автоматически выпускается. Это означает, что оно будет дважды выпущено, когда пул авторелиза будет исчерпан (обычно во время цикла событий).

Комментарии:

1. Как я уже сказал, я новичок. onScreenTextValue — это NSString* . Каков был бы правильный способ его написания?