integerForKey: всегда возвращает ноль - PullRequest
1 голос
/ 22 июня 2010

Я пытаюсь получить значение из моего файла настроек, которое является целым числом.Самое смешное, что он всегда возвращает ноль, хотя он существует и имена для 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 ]

3 голосов
/ 22 июня 2010

8589934592 - это жестко запрограммированный литерал? Правда? Вы должны хотя бы поставить что-то вроде 1 << 33. Даже тогда, объявите это как константу, для того, чтобы громко плакать.

Если вы строите для 32-битного, NSInteger - это 32-битное значение со знаком. Таким образом, вы, скорее всего, переполнены. Я не уверен, что поведение NSUserDefaults будет в этом случае, но это стоит рассмотреть.

1 голос
/ 09 апреля 2014

Другая распространенная причина такого рода проблем - использование пользовательских сеттеров, которые сохраняют значения по умолчанию для пользователя.Если вы сделаете это, и если вы не будете осторожны, чтобы получить доступ только к ivars в вашем коде по умолчанию, вы рискуете помешать сохраненным настройкам во время чтения.

0 голосов
/ 22 июня 2010

Вы передаете двойное число во что-то, что ожидает целое число. Обычно вы ожидаете, что произойдет некоторое усечение, и в результате получится int, но вы не можете гарантировать, что метод setInteger:forKey: сделает это за вас.

Почему вы умножаете значение вашего слайдера на это явно произвольное число?

Edit:

Чтобы объяснить мой ответ немного больше:

Для сохранения чисел в значениях по умолчанию их необходимо заключить в NSNumber объекты. setInteger:forKey и др. - это вспомогательные методы, которые, вероятно, просто берут ваше целое число и создают из него NSNnumber, используя numberWithInt:. Я не могу быть уверен на 100%, потому что я не видел код Apple, но я бы предположил, что передача значения double в numberWithInt: вернет nil, потому что значение double не является целым.

...