当值为浮点数时,值从变量释放

时间:2013-08-10 05:29:31

标签: iphone ios nsnumber

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

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

@property (retain,nonatomic) NSNumber* currentValue;  
@property (retain,nonatomic) NSNumber* previousValue;

在我的.m文件中有两种方法,我面临问题

- (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;
    }
}

1 个答案:

答案 0 :(得分:1)

您正在直接访问实例变量,并使用手动引用计数。这不会起作用。

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

self.currentValue = ....;

从不

_currentValue = ...;

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