NSUserDefaults для iPhone SDK не возвращает ноль - PullRequest
0 голосов
/ 06 февраля 2009

Я использую NSUserDefaults для приложения настроек. Это чистая копия, и я вообще ничего не добавил в файловую систему для этого конкретного параметра. Я ожидаю, что это будет ноль, но наоборот ..

Если я сделаю что-то вроде следующего:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ( [defaults valueForKey:kIdentifierKey] == nil ) {
    return YES;
}
else {
    NSLog(@"we have a value. return NO. Value is: %@", [defaults objectForKey:kIdentifierKey]);
    return NO;
}

Тем не менее, в NSLog ничего не показывает, где вы ожидаете значение. Блок else действительно выполняется. Есть ли причина, почему это НЕ ноль?

Ответы [ 2 ]

6 голосов
/ 06 февраля 2009

valueForKey: вид сложного метода во всех местах, где он ищет. Я считаю более надежным использовать геттеры для конкретных типов данных при работе со значениями по умолчанию.

if ([defaults boolForKey:kIdentifierKey]) [self doSomething];

Или вы можете использовать objectForKey: который должен возвращать ноль, как вы ожидаете. Фактически, вы делаете это, когда создаете оператор NSLog. И строковое описание nil равно @ "", так что вы получите то, что ожидаете.

Кроме того, здесь вы тестируете и регистрируете различные ключи:

[defaults valueForKey:kIdentifierKey];
[defaults objectForKey:kGroupIdentifierKey];

Убедитесь, что вы тестируете и записываете, что вы думаете.


Тест из нового проекта iPhone:

if (![[NSUserDefaults standardUserDefaults] valueForKey:@"foobar"])         NSLog(@"is not yet defined");
if (![[NSUserDefaults standardUserDefaults] objectForKey:@"foobar"])        NSLog(@"is not yet defined");
if ([[NSUserDefaults standardUserDefaults] valueForKey:@"foobar"] == nil)   NSLog(@"valueForKey is nil");
if ([[NSUserDefaults standardUserDefaults] objectForKey:@"foobar"] == nil)  NSLog(@"objectForKey is nil");

Выводит:

is not yet defined
is not yet defined
valueForKey is nil
objectForKey is nil

Я думаю, у вас здесь что-то еще происходит.

0 голосов
/ 06 февраля 2009

На основании документов ....

"Значением по умолчанию должно быть свойство список, то есть экземпляр (или для Коллекции комбинация экземпляров из): NSData, NSString, NSNumber, NSDate, NSArray или NSDictionary. Если Вы хотите хранить любой другой тип объект, вы должны обычно архивировать это создать экземпляр NSData. Для получения дополнительной информации см. Пользовательские настройки по умолчанию. Темы программирования для какао. "

Кроме того, [defaulta valueForKey:] не является методом экземпляра в соответствии с документацией, поэтому результат, скорее всего, не определен. Если вы используете [defaults objectForKey:], он вернет nil, если объект, связанный с kIdentifierKey не найден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...