Ваша ошибка вне области видимости может объясняться тем фактом, что 'total' и 'itemPrice1' определены как переменная экземпляра и используются как таковые, то есть вы используете их в классе. Метод getDefaults устанавливает их значения, которые затем используются в других методах. Однако, инициализируя эти переменные как:
total = [NSDecimalNumber decimalNumberWithString:@"0"];
item1Price = (NSDecimalNumber *)[dict valueForKey:@"item1"];
... они автоматически выпускаются в конце этого метода (в этой области). У вас есть два варианта инициализации:
total = [[NSDecimalNumber decimalNumberWithString:@"0"] retain];
// OR
total = [[NSNumber alloc] initWithString:@"0"];
Независимо от того, какой вариант вы выберете из вышеперечисленных, вам придется выпустить его позже (обычно в методе dealloc класса).
Не уверен, что проблема была в использовании NSNumber. Вы упомянули, что float недостаточно точен, и в этом случае я бы просто использовал double. Вы могли бы сделать это:
double totalSetter = 0.0;
NSNumber *total = [[NSNumber alloc] initWithDouble:totalCaster];
, а затем получить с помощью:
double totalGetter = [total doubleValue];
Теперь вы должны иметь возможность использовать NSNumberFormatter с вашими NSNumbers.