NSUserDefaults and KVO issues

Though its not well documented, NSUserDefaults do support key-value observing in iOS7.


I suggest making use of the appropriate notification: NSUserDefaultsDidChangeNotification.

Search for AppPrefs in the Apple Documentation within Xcode and it'll show an example app which does exactly what you want to do. Just compile and run! It makes use of the NSUserDefaultsDidChangeNotification.

This is the code being used to register an observer:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(defaultsChanged:)
                                             name:NSUserDefaultsDidChangeNotification
                                           object:nil];

Interesting observation:

[NSUserDefaults standardUserDefaults] seems to be KVO compliant now as I am able to observe and bind to it's values. I'm running 10.7.2, using Xcode 4.2, SDK 10.7, LLVM compiler 3.0 .

I can't seem to find this new behavior documented anywhere in the release notes.


NSUserDefaults is not KVO compliant, but NSUserDefaultsController is. So you'd use:

NSUserDefaultsController *defaultsc = [NSUserDefaultsController sharedUserDefaultsController];
[defaultsc addObserver:self forKeyPath:@"values.pref_server" 
               options:NSKeyValueObservingOptionNew 
               context:NULL];

Tags:

Ios