Я столкнулся с такой странной проблемой прямо сейчас, я пытаюсь реализовать калькулятор в своем проекте демо. Место, которое я хочу реализовать, - это возможность ARC, и мой проект ARC отключает все, что отлично работает в этой демонстрации, работая отлично в моем проекте tOO, но когда я пытаюсь выполнить операцию над значениями float, тогда мое аварийное завершение приложения говорит об EXC_BAD_ACCESS (код 1 ... . ниже мой кодЗначение освобождается от переменной, когда значение является числом с плавающей запятой
_currentValue и _previousValue, как это в файле .h
@property (retain,nonatomic) NSNumber* currentValue;
@property (retain,nonatomic) NSNumber* previousValue;
в моем файле .m есть 2 способа, где я сталкиваюсь с проблемой
- (NSString *)calculateValueToString:(NSString *)valueString ForType:(enum State)type{
_currentValue = [numberFormatterFormal numberFromString:valueString];
NSLog(@"%@",_currentValue); //whatever number i input it get prints here
[self calculateValue]; // this method get called
state = type;
if (state != Equal){
_previousValue = _currentValue;
NSLog(@"%@",_previousValue); // get print
_currentValue = @0 ;
}
NSLog(@"_previousValue%@",_previousValue); // get print
NSLog(@"_currentValue%@",_currentValue); // get print
return [numberFormatterFormal stringFromNumber:_currentValue];
}
- (void)calculateValue{
switch (state) {
case Plus:
_currentValue = [NSNumber numberWithDouble:[_previousValue doubleValue] + [_currentValue doubleValue]];
break;
case Minus: //GET ONLY EXECUTE ONLY IF OPERATION IS -
NSLog(@"%@",_currentValue); // it has value
--->>>>>>> HERE APP CRASH NSLog(@"%@",_previousValue); // app crashes here
_currentValue = [NSNumber numberWithDouble:[_previousValue doubleValue] - [_currentValue doubleValue]];
NSLog(@"%@",_currentValue);
// THIS ALL WORK PERFECTLY IN THAT DEMO WHICH IS ARC ENABLE
break;
case Multiple:
_currentValue = [NSNumber numberWithDouble:[_previousValue doubleValue] * [_currentValue doubleValue]];
break;
case Divide:
_currentValue = [NSNumber numberWithDouble:[_previousValue doubleValue]/[_currentValue doubleValue]];
break;
default:
break;
}
}
Где вы инициализируете и выпускаете previousValue и currentValue? – geekchic
не инициализировать и не выпускать их –
Но если ARC отключен, вам необходимо «сохранить» и «освободить» для управления памятью. – geekchic