2010-06-22 4 views
1

Я пытаюсь получить значение из моего файла предпочтений, который является целым числом. Самое смешное, что он всегда возвращает ноль, хотя он существует и имена для integerForKey: и setIntegerForKey: одинаковы.integerForKey: всегда возвращает ноль

Вот как я получить значение: [defaults integerForKey:@"BackUpSize"];

И вот я поставил его: [defaults setInteger:[sizeSlider doubleValue]*8589934592 forKey:@"BackUpSize"];

Я ошеломлен. Это должно сработать ... или я чего-то не хватает?

Благодаря

Edit: по умолчанию создается как например: NSUserDefaults*defaults = [NSUserDefaults standardUserDefaults];

Edit: Я попытался создать свой собственный метод 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]; 
} 
+1

Вы подтвердили, что 'defaults' не' nil'? Метод-вызовы на 'nil' return ...' 0'. –

+1

defaults - это просто [NSUserDefaults standardUserDefaults] ... – Pripyat

+1

просто проверил его, и это не ноль. – Pripyat

ответ

3

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

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

+3

Я впечатлен тем, что вы узнали его как 1 << 33 на виду. ☺ –

0

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

Почему вы умножаете значение ползунка на это, по-видимому, произвольное число?

Edit:

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

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

+1

причина, по которой я умножаю это, потому что слайдер должен определить, сколько пространства может использовать мое приложение, которое определено в байтах в моем случае, но мне нужно это в GB 1 байт раз 8589934592 равно 1 ГБ. то я сравниваю размер папки (которая также находится в байтах, поэтому мне нужно снова ее умножить), а ползунок - чтобы увидеть, достигнут ли предел или нет. Что я должен использовать вместо setIntegerForKey? просто используйте setObjectForKey? – Pripyat

+1

objectForKey не будет работать ... – Pripyat

+1

Я бы предложил создать объект NSNumber из вашего последнего двойного значения, используя 'numberWithDouble:', а затем используя 'setObject: forKey'. – Jasarien

1

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

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