Сбой приложения iOS при запуске следующего кода - PullRequest
1 голос
/ 05 октября 2011

Я новичок в разработке калькулятора, чтобы познакомиться с 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];
}

Ответы [ 2 ]

5 голосов
/ 05 октября 2011

В этом коде:

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

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

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

 [pressedOpp release];

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

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

 self.onScreenTextValue = [value stringValue];

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

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

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

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

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

1 голос
/ 05 октября 2011

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

onScreenTextValue =[value stringValue];

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...