2009-05-12 5 views
3

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

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

Как получить int, который я сохранил в стандартеUserDefaults? Я развиваюсь против 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"]; 
    } 
} 

ответ

4

Ваш второй 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:] для получения дополнительной информации.

+0

Спасибо за удивительно быстрый и правильный ответ! (длинный) сделал трюк. Я пробовал использовать (int) раньше, но это не помогло, и приложение продолжало сбой. Не могли бы вы объяснить разницу между long и int по отношению к setInteger: forKey и integerForKey? Еще раз спасибо! Я немного погладил эту проблему. – sam

+0

ОК спасибо. похоже, что оператор журнала действительно вызывал сбой, и я неправильно объяснял крах другим вещам, например, integerForKey не работал должным образом. – sam

+0

SetInteger: использует тип NSInteger, который определяется как 32-разрядное целое число в 32-разрядных приложениях и 64-разрядное в 64-разрядных приложениях; то есть это всегда размер регистра процессора. Что касается литья, то при отливке до 32 бит в 32-битных процессах и 64-битном значении в 64-битных процессах он будет соответствовать размеру NSInteger. Это также то, что Apple рекомендует передавать NSInteger или NSUInteger в функцию типа printf. –

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