-2

我现在正面临这样一个奇怪的问题,我正在尝试在我的项目演示中实现计算器。我要实现的地方是启用 ARC 并且我的项目 ARC 禁用一切都在该演示中运行良好,它在我的项目中运行完美 tOO 但是当我尝试对浮点值进行操作时,我的应用程序崩溃说 EXC_BAD_ACCESS(代码 1 ... . 下面是我的代码

.h 文件中的 _currentValue 和 _previousValue 是这样的

@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;
    }
}
4

1 回答 1

1

您正在直接访问您的实例变量,并使用手动引用计数。这是行不通的。

所有的内存管理都在综合访问器方法中完成,因此您必须使用属性访问器,例如:

self.currentValue = ....;

绝不

_currentValue = ...;

或者您将绕过访问者为您执行的所有保留/释放调用。

于 2013-08-10T07:53:39.837 回答