Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 有人能解释一下NSUserDefaults中的搜索列表功能吗?_Objective C_Ios_Nsuserdefaults - Fatal编程技术网

Objective c 有人能解释一下NSUserDefaults中的搜索列表功能吗?

Objective c 有人能解释一下NSUserDefaults中的搜索列表功能吗?,objective-c,ios,nsuserdefaults,Objective C,Ios,Nsuserdefaults,我对NSUserDefaults中的搜索列表功能感到困惑。关于standardUserDefaults类方法,它设置了一个由五个域组成的标准搜索列表。该方法的文档还暗示此搜索列表可以更改(我添加了粗体): 即使再次调用此方法,对标准搜索列表的后续修改仍然有效。只有在第一次调用此方法时,才能保证搜索列表是标准的 我们还来看看init的文档: 返回值:已初始化的NSUserDefaults对象,其参数和注册域已设置 讨论:此方法不会将任何内容放入搜索列表中 在我看来,这是一个矛盾:要么搜索列表是空的

我对
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"]);

如您所见,我试图通过调用
removeSuiteName:
removeVolatileDomainForName:
从搜索列表中删除
NSRegistrationDomain
。这不起作用,至少在我运行测试的iOS上不起作用,但我假设在Mac OS X上也是如此。所以我的问题如下:


  • 在iOS上,有没有办法从
    NSUserDefaults
    对象的搜索列表中删除五个标准域中的一个?请注意,它不一定是
    standardUserDefaults
    返回的对象,我很乐意创建自己的对象。如果有关系:我特别想摆脱
    nsrregistrationdomain
  • 如果上述问题的答案是“否”,那么我们是否可以说这五个标准域只是“不可变的”,而
    NSUserDefaults
    中关于添加/删除套件和持久性/易失性域的所有内容都是关于用户定义的域
  • 有没有办法找到
    NSUserDefaults
    对象的搜索列表中的内容

  • 我怀疑我已经知道答案(否、是和否),但至少我正在寻找更有经验的人来证实我的怀疑。

    尝试在修改后立即致电[myuserDefaults synchronize]


  • 要摆脱像
    nsrregistrationdomain
    这样的域,应使用
    removeVolatileDomainForName:
    。但是,这不适用于
    NSRegistrationDomain
    NSArgumentDomain
    。这两个问题无法解决。尝试使用
    setVolatileDomain:forName:
    注册您自己的域。你可以移除这个

    我相信在standardUserDefaults的五个域中,您可以通过
    removePersistentDomainForName:
    删除自己的域,并传递包标识符。但我还没试过

    由于
    NSGlobalDomain
    是持久的,您只能将自己的包标识符传递给
    removePersistentDomainForName:
    ,因此我相信您无法删除
    NSGlobalDomain
    。同样,这是未经测试的

  • 我相信是这样的,除了带有bundle标识符的持久域

  • 不需要,但是使用
    -volatileDomains
    对于大多数目的来说应该足够了


  • NSRegistrationDomain
    项目是由开发人员设置的,因此您正在设置它们,然后想忽略它们?@CocoaFu:是的,没错。这与我的一个类有关,该类希望将用户默认值升级到一个更新的格式,我更希望我能够以一种可以工作的方式编写该类,而不管注册域默认值是否已经加载。但是,请记住,问我问题的目的不是为了解决这个特定的问题(我已经有了解决方案),而是为了弄清楚是否可以修改
    NSUserDefaults
    的标准搜索列表。我觉得这些文件在这方面相当混乱。谢谢。我接受你的回答,因为它证实了我已经怀疑的事情。尽管如此,我们仍然欢迎更多的见解:-)