I am confused about the search list function in NSUserDefaults . The class reference talks about the standardUserDefaults class method, which sets a standard search list of five domains. The docs for this method also imply that this search list can be changed (courage added by me):
Subsequent modifications to the standard search list remain valid even when this method is called again - the search list is guaranteed to be standard only when this method is first called.
Let's also look at the docs for init :
Return value: An initialized NSUserDefaults object whose arguments and registration domains are already configured.
Discussion: This method does not put anything in the search list.
In my understanding, this is a contradiction: either the search list is empty, or it contains entries for the arguments and registration domains.
Anyway, I experimented a bit:
NSUserDefaults* standardUserDefaults = [NSUserDefaults standardUserDefaults]; // We get nil, which is expected NSLog(@"test 1: expecting nil, getting %@", [standardUserDefaults objectForKey:@"foo"]); NSDictionary* registrationDomainDefaults = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:42] forKey:@"foo"]; [standardUserDefaults registerDefaults:registrationDomainDefaults]; // We get 42, which is expected NSLog(@"test 2: expecting 42, getting %@", [standardUserDefaults objectForKey:@"foo"]); [standardUserDefaults removeSuiteNamed:NSRegistrationDomain]; [standardUserDefaults removeVolatileDomainForName:NSRegistrationDomain]; // Here we get 42! NSLog(@"test 3: expecting nil, getting %@", [standardUserDefaults objectForKey:@"foo"]); NSUserDefaults* myUserDefaults = [[NSUserDefaults alloc] init]; // Here we also get 42! NSLog(@"test 4: expecting nil, getting %@", [myUserDefaults objectForKey:@"foo"]); [myUserDefaults removeSuiteNamed:NSRegistrationDomain]; [myUserDefaults removeVolatileDomainForName:NSRegistrationDomain]; // We still get 42 *sigh* NSLog(@"test 5: expecting nil, getting %@", [myUserDefaults objectForKey:@"foo"]);
As you can see, I am trying to remove NSRegistrationDomain from the search list by calling both removeSuiteNamed: and removeVolatileDomainForName: This does not work, at least not on iOS, where I ran the tests, but I assume it is the same on Mac OS X. So these are my questions:
- On iOS, is there a way to remove one of the five standard domains from the
NSUserDefaults object's search list? Note that this does not have to be the object returned by standardUserDefaults , I would be happy to create my own object. In case it matters: I'm especially interested in getting rid of the NSRegistrationDomain . - If the answer to the above is βno,β can we say that the five standard domains are simply βimmutableβ and that all things in
NSUserDefaults about adding / removing packages and persistent / mutable domains refer to user defined domains? - Is there a way to find out what is in the
NSUserDefaults object's search list?
I suspect I already know the answers (no, yes and no), but at least I'm looking for someone who has more experience to confirm my suspicions.
ios objective-c nsuserdefaults
herzbube
source share