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.

Другие вопросы по тегам