integerForKey всегда вылетает приложение - PullRequest
3 голосов
/ 12 мая 2009

Получение значения из standardUserDefaults с использованием integerForKey после сохранения с помощью setInteger: forKey всегда приводит к сбою приложения.

Если я получу значение с помощью objectForKey и приведу значение к int, ошибок не будет, и я смогу отобразить значение в сообщении журнала. Однако, когда я пытаюсь присвоить этот int другому int или пытаюсь выполнить с ним математическую функцию, например, добавление, это также приводит к сбою приложения.

Как получить int, который я сохранил в standardUserDefaults? Я работаю против SDK 3.0, но столкнулся с идентичной проблемой в 2.2.1. Спасибо.

привилегии, определенные как

NSUserDefaults *prefs;

и retrievePrefs всегда вызывается перед savePrefs. Приложение также вызывает [prefs synchronize] перед выходом.

-(void)retrievePrefs {
    prefs = [[NSUserDefaults standardUserDefaults] retain];
    if (prefs) {
       // doesn't crash app, spits out 'page: 1'
       NSLog(@"page: %@", [prefs objectForKey:@"pageIndex"]); 

       // crashes app with no details
       NSLog(@"page: %@", [prefs integerForKey:@"pageIndex"]); 
    }
}


-(void)savePrefs {
    if (prefs) {
        [prefs setInteger:1 forKey:@"pageIndex"];
    }
}

1 Ответ

4 голосов
/ 12 мая 2009

Ваш второй вызов NSLog является причиной его возникновения: квалификатор %@ используется для вывода объектов Objective C или CoreFoundation CFTypeRefs, поэтому он интерпретирует это целое число как указатель и пытается разыменовать его.

Что вам нужно:

-(void)retrievePrefs {
    prefs = [[NSUserDefaults standardUserDefaults] retain];
    if (prefs) {
        NSLog(@"page: %@", [prefs objectForKey:@"pageIndex"]);
        NSLog(@"page: %ld", (long)[prefs integerForKey:@"pageIndex"]);
    }
}

Для получения дополнительной информации см. Документацию API для NSLog, printf и -[NSString stringWithFormat:].

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