После дублирования вашего кода и добавления дополнительных операторов отладки все выглядит так, как вы хотите. Я создал новый проект на основе View в Xcode 4, добавил «DefaultsPrefs.plist» с 5 ключами с / 1001 * значениями по умолчанию, и мой AppDelegate был изменен, чтобы выглядеть так:
- (IBAction) savePreferences:(id)sender {
NSUserDefaults* prefs = [NSUserDefaults standardUserDefaults];
NSLog(@"NSUserDefaults: %@", [prefs dictionaryRepresentation]);
[prefs synchronize];
[[NSUserDefaults standardUserDefaults] setObject:@"UpdatedKey1Val" forKey:@"MyKey1"];
[[NSUserDefaults standardUserDefaults] setObject:@"UpdatedKey2Val" forKey:@"MyKey2"];
NSLog(@"NSUserDefaults: %@", [prefs dictionaryRepresentation]);
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
NSLog(@"MyKey1 before registerDefaults: %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"MyKey1"]);
NSLog(@"MyKey2 before registerDefaults: %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"MyKey2"]);
NSDictionary *userDefaultsDefaults = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"DefaultsPrefs" ofType:@"plist"]];
NSLog(@"MyKey1 from userDefaultsDefaults: %@", [userDefaultsDefaults objectForKey:@"MyKey1"]);
NSLog(@"MyKey2 from userDefaultsDefaults: %@", [userDefaultsDefaults objectForKey:@"MyKey2"]);
[[NSUserDefaults standardUserDefaults] registerDefaults:userDefaultsDefaults];
NSLog(@"MyKey1 after registerDefaults: %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"MyKey1"]);
NSLog(@"MyKey2 after registerDefaults: %@", [[NSUserDefaults standardUserDefaults] objectForKey:@"MyKey2"]);
[self savePreferences:nil];
return YES;
}
С выводом (удаление ненужных пар из NSUserDefaults
):
MyKey1 before registerDefaults: (null)
MyKey2 before registerDefaults: (null)
MyKey1 from userDefaultsDefaults: InitialMyKey1Val
MyKey2 from userDefaultsDefaults: InitialMyKey2Val
MyKey1 after registerDefaults: InitialMyKey1Val
MyKey2 after registerDefaults: InitialMyKey2Val
NSUserDefaults: {
MyKey1 = InitialMyKey1Val;
MyKey2 = InitialMyKey2Val;
MyKey3 = InitialMyKey3Val;
MyKey4 = InitialMyKey4Val;
MyKey5 = InitialMyKey5Val;
}
NSUserDefaults: {
MyKey1 = UpdatedKey1Val;
MyKey2 = UpdatedKey2Val;
MyKey3 = InitialMyKey3Val;
MyKey4 = InitialMyKey4Val;
MyKey5 = InitialMyKey5Val;
}
При повторном запуске вывод запускается:
MyKey1 before registerDefaults: UpdatedKey1Val
MyKey2 before registerDefaults: UpdatedKey2Val
Это как и ожидалось. Вы должны делать что-то еще неправильно, потому что это кажется правильным.