#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 и имя — это не одно и то же: первый использует свойство, а второй — необработанный доступ к полю, который обходит сгенерированный установщик)
-
Ознакомьтесь с семантикой подсчета ссылок
http://www.loufranco.com/blog/files/managing-memory-iphone.html
-
-или- Обновите до последней версии Xcode и используйте автоматический подсчет ссылок.
Еще одна простая вещь, которую нужно сделать, это всегда запускать «Сборка и анализ» и обязательно устранять каждую проблему. Он действительно хорош для поиска неправильных версий (фактически, этот же код стоит за автоматическим подсчетом ссылок)
Комментарии:
1. onScreenTextValue — это NSString . В настоящее время я использую Xcode 4.02 на SL. В настоящее время у меня нет никаких проблем с «Сборкой и анализом»
2. Добавление this.onScreenTextValue дает мне «использование необъявленного идентификатора «this»»
3. Спасибо, я просто удалил значение и нажал кнопку opp release, и все работает нормально. Еще раз спасибо
Ответ №2:
Вы неправильно управляете памятью. Например, код
onScreenTextValue =[value stringValue];
присваивает полю значение, полученное автоматически. Вы всегда должны сохранять поля и освобождать их позже.
Кроме того, вы выпускаете value
, который автоматически выпускается. Это означает, что оно будет дважды выпущено, когда пул авторелиза будет исчерпан (обычно во время цикла событий).
Комментарии:
1. Как я уже сказал, я новичок. onScreenTextValue — это NSString* . Каков был бы правильный способ его написания?