我对NSUserDefaults
中的搜索列表功能感到困惑。 The class reference说明standardUserDefaults
类方法,它设置了由五个域组成的标准搜索列表。该方法的文档也暗示可以更改此搜索列表(由我添加粗体):
即使再次调用此方法,标准搜索列表的后续修改仍然有效 - 只有在第一次调用此方法时,才能保证搜索列表是标准的。
让我们看一下init
的文档:
返回值:已初始化的NSUserDefaults对象,其参数和注册域已设置。
讨论:此方法不会在搜索列表中放置任何内容。
根据我的理解,这是一个矛盾:搜索列表为空,或者包含参数和注册域的条目。
无论如何,我做了一些实验:
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"]);
如您所见,我尝试通过调用NSRegistrationDomain
和removeSuiteNamed:
从搜索列表中删除removeVolatileDomainForName:
。这不起作用,至少在运行测试的iOS上没有用,但我认为它在Mac OS X上是一样的。所以这些是我的问题:
NSUserDefaults
对象的搜索列表中删除五个标准域中的一个?请注意,它不一定必须是standardUserDefaults
返回的对象,我很乐意创建自己的对象。如果重要:我特别想摆脱NSRegistrationDomain
。NSUserDefaults
中关于添加/删除套件和持久性/易变域的所有内容都是关于用户定义的域?NSUserDefaults
对象的搜索列表中的内容?我怀疑我已经知道了答案(不,是,不),但至少我正在寻找有经验证明我怀疑的人。
答案 0 :(得分:1)
要摆脱NSRegistrationDomain
之类的域名,您应该使用removeVolatileDomainForName:
。但是,这不适用于NSRegistrationDomain
和NSArgumentDomain
。这两个无法删除。尝试使用setVolatileDomain:forName:
注册您自己的域名。你将能够删除这个。
我相信在standardUserDefaults的五个域中,您可以使用removePersistentDomainForName:
删除自己的域,并传递您的包标识符。但我没试过这个。
由于NSGlobalDomain
是持久的,并且您只能将自己的包标识符传递给removePersistentDomainForName:
,我相信您无法删除NSGlobalDomain
。再次,这是未经测试的。
我相信,除了包含标识符的持久域名。
不,但使用-volatileDomainNames
应足以满足大多数用途。
答案 1 :(得分:0)
尝试在修改后立即调用[myuserDefaults synchronize]