integerForKey: всегда возвращает ноль
Я пытаюсь получить значение из моего файла настроек, который является целым числом. Самое смешное, что он всегда возвращает ноль, хотя он существует и имена для обоих integerForKey:
а также setIntegerForKey:
подобные.
Вот как я получаю значение: [defaults integerForKey:@"BackUpSize"];
И вот я установил это: [defaults setInteger:[sizeSlider doubleValue]*8589934592 forKey:@"BackUpSize"];
Я ошеломлен Должно работать... или я что-то здесь упускаю?
Спасибо
Редактировать: по умолчанию создается так: NSUserDefaults*defaults = [NSUserDefaults standardUserDefaults];
Изменить: я попытался создать свой собственный метод NSUserDefaults для этой проблемы, но он по-прежнему возвращает ноль.
-(void)setDouble:(double)dou forKey:(id)key
{
[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithDouble:dou] forKey:key];
}
-(double)doubleForKey:(id)key
{
return [[[NSUserDefaults standardUserDefaults] objectForKey:key] doubleValue];
}
3 ответа
8589934592
такое жестко запрограммированный литерал? В самом деле? Вы должны хотя бы поставить что-то вроде 1 << 33
, Даже тогда, объявите это как константу, для того, чтобы громко плакать.
Если вы строите для 32-битных, NSInteger
является 32-битным значением со знаком. Таким образом, вы, скорее всего, переполнены. Я не уверен, что поведение NSUserDefaults будет в этом случае, но это стоит рассмотреть.
Другой распространенной причиной такого рода проблем является использование пользовательских сеттеров, которые сохраняют значения по умолчанию для пользователя. Если вы сделаете это, и если вы не будете осторожны, чтобы получить доступ только к ivars в вашем пользовательском коде по умолчанию, вы рискуете помешать сохраненным настройкам во время чтения.
Вы передаете двойное число во что-то, что ожидает целое число. Обычно вы ожидаете, что произойдет некоторое усечение, и в результате вы получите int, но вы не можете гарантировать, что setInteger:forKey:
метод делает это для вас.
Почему вы умножаете значение вашего слайдера на это явно произвольное число?
Редактировать:
Чтобы объяснить мой ответ немного больше:
Чтобы сохранить числа в значениях по умолчанию, их нужно обернуть в NSNumber
объекты. setInteger:forKey
и др. - это удобные методы, которые, вероятно, просто берут ваше целое число и создают NSNnumber
из него, используя numberWithInt:
, Я не могу быть уверен на 100%, потому что я не видел код Apple, но я бы предположил, что передача двойного numberWithInt:
вернет ноль, потому что double не является int.