her*_*ube 8 objective-c nsuserdefaults ios
我对搜索列表功能感到困惑NSUserDefaults.类引用说明了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"]);
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我想删除NSRegistrationDomain从搜索列表中,通过调用这两个removeSuiteNamed:和removeVolatileDomainForName:.这不起作用,至少在我运行测试的iOS上没有用,但我认为它在Mac OS X上是一样的.所以这些是我的问题:
NSUserDefaults对象的搜索列表中删除五个标准域之一?请注意,它不一定是返回的对象standardUserDefaults,我很乐意创建自己的对象.万一重要:我特别感兴趣摆脱NSRegistrationDomain.NSUserDefaults关于添加/删除套件和持久/易失性域的所有内容都是关于用户定义的域吗?NSUserDefaults对象的搜索列表中的内容?我怀疑我已经知道了答案(不,是,不),但至少我正在寻找有经验的人来证实我的怀疑.
要摆脱类似的域NSRegistrationDomain,您应该使用removeVolatileDomainForName:. 但是,这不适用于NSRegistrationDomain和NSArgumentDomain。这两个不能去掉。尝试注册您自己的域名setVolatileDomain:forName:。您将能够删除这个。
我相信在 standardUserDefaults 的五个域中,您可以使用 删除您自己的域removePersistentDomainForName:,并传递您的包标识符。但我还没有尝试过这个。
由于NSGlobalDomain是持久性的,您只能将自己的包标识符传递给removePersistentDomainForName:,我相信您无法删除NSGlobalDomain。再说一遍,这是未经测试的。
我相信是的,除了带有你的包标识符的持久域。
不,但使用-volatileDomainNames应该足以满足大多数目的。
| 归档时间: |
|
| 查看次数: |
1540 次 |
| 最近记录: |