2013-08-10 1 views
-2

Я столкнулся с такой странной проблемой прямо сейчас, я пытаюсь реализовать калькулятор в своем проекте демо. Место, которое я хочу реализовать, - это возможность 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; 
    } 
} 
+0

Где вы инициализируете и выпускаете previousValue и currentValue? – geekchic

+0

не инициализировать и не выпускать их –

+0

Но если ARC отключен, вам необходимо «сохранить» и «освободить» для управления памятью. – geekchic

ответ

1

вы обращаетесь ваши переменные экземпляра напрямую и используя ma нулевой подсчет ссылок. Это не сработает.

Все управление памятью осуществляется в синтезированных методами доступа, так что вы должны использовать свойство аксессоров, например:

self.currentValue = ....; 

Никогда

_currentValue = ...; 

Или вы будете в обход всех вызовов сохранения/освобождения, которые для вас делают аксессоры.

+0

, но некоторые, где я слышал, что в ios нам не нужно синтезировать свойство, мы можем использовать _currentvalue, прямо исправить меня, пожалуйста, если я пойду в неправильном направлении –

+0

И сэр еще один вопрос, все работает отлично, но проблема только возникают, когда операция минус, и значения плавают, почему так? почему я не сталкиваюсь с проблемой в каждой моей операции? –

+0

Вам не нужно синтезировать свойства, и ivar создан для вас, но если вы используете ручной подсчет ссылок, вы _must_ используете аксессоры свойств. Что касается вашего второго вопроса, вероятно, из-за того, что NSNumber использует синглтоны для целых чисел с низким значением, поэтому у вас нет проблемы с выпуском. – jrturton

 Смежные вопросы

  • Нет связанных вопросов^_^