Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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
Iphone 最佳实践-全球访问首选项_Iphone_Cocoa_Cocoa Touch - Fatal编程技术网

Iphone 最佳实践-全球访问首选项

Iphone 最佳实践-全球访问首选项,iphone,cocoa,cocoa-touch,Iphone,Cocoa,Cocoa Touch,我的应用程序的用户首选项是NSUserDefaults中的store。这包括一个“主题”首选项,需要由多个类频繁访问。我不希望调用“[[NSUserDefaults standardUserDefaults]objectForKey:…”重复使用,因为它会导致不精确的代码,我认为这会带来开销。在任何类中,访问首选项的首选和最简洁的方法是什么?访问用户首选项的首选方法是您的操作方式,这几乎不是不精确的。在实际注意到之前,您不应该假设开销 这样说,考虑在启动时从用户首选项中读取主题值,然后将相应的主

我的应用程序的用户首选项是NSUserDefaults中的store。这包括一个“主题”首选项,需要由多个类频繁访问。我不希望调用“[[NSUserDefaults standardUserDefaults]objectForKey:…”重复使用,因为它会导致不精确的代码,我认为这会带来开销。在任何类中,访问首选项的首选和最简洁的方法是什么?

访问用户首选项的首选方法是您的操作方式,这几乎不是不精确的。在实际注意到之前,您不应该假设开销


这样说,考虑在启动时从用户首选项中读取主题值,然后将相应的主题设置存储在主题对象中。然后,当调用它们的方法时,可以将该主题对象传递给各个类,并且可以使用它。作为奖励,最终可以通过任意的主题对象。用户设置的ESS,允许您在主题选择界面中使用它们的主题预览输出,假设这些类涉及用户可见输出。只是要考虑的事情。

开销很小,根本不要紧。剩下的是设计和平衡的问题。“正确”从设计角度解决此问题的方法是通过在类接口中公开一个出口,使对用户默认值的依赖性可见:

@interface ClassThatUsesSomethingFromDefaults : NSObject {
    NSUserDefaults *prefs;
}

@property(retain) NSUserDefaults *prefs;
这样,很明显,该类的行为会随用户默认值的不同而变化,这是一件好事。它还使您更容易使用该类中的默认值(调用
prefs
,而不是
[NSUserDefaults standardUserDefaults]
)。这样可以更容易地将该类与系统的其余部分隔离开来–您可以在不使用默认值的情况下使用该类,提供存根默认值对象或诸如此类的对象

此解决方案的缺点是,您必须重新考虑将对象连接在一起的方式。这确实是一个优点。
prefs
等依赖项必须“从外部世界”提供给对象,如从接口生成器或某种工厂类。(正如我在开头所说的,这是一个平衡的问题。如果你只有一个偏好字符串,那么构建所有这些来获得单个字符串可能是不值得的。)

单身汉是解决这一问题的魔鬼之路——请阅读米什科·赫弗利的博客文章以及由此链接的博客文章。

更新:
调用[NSUserDefaults standardUserDefaults]不引入额外的开销,尽管它可能不是最简洁的。它可能不是最简洁的唯一时间是当复杂对象包含在首选项中时,例如字典或数组-在这种情况下,您可能希望在初始化时分配给局部变量。

谢谢。我不想使用主题对象来传递给您nd,因为这将涉及在每个想要使用它的类中声明、合成等它的属性。我希望有一个解决方案,它将涉及类似于首选项类的东西,我可以简单地导入,然后访问存储的首选项,就像访问存储在头文件中的常量一样。也许单例类可以实现e这是什么?您已经使用+StandardUserDefault访问了一个共享首选项对象。至于主题对象,我不是说在每个类中将其设置为属性。相反,每个类的输出方法可以将主题对象作为参数,例如-(NSAttributedString*)outputUsingTheme:(MyTheme*)aTheme。中央控制器可以将主题存储为属性,并将其传递给每个类的输出方法,将每个结果附加到最终输出,以便向用户演示。谢谢,但您的建议需要每个类4行代码(变量声明、属性声明、合成、发布)除了将首选项分配给类之外,为首选项创建局部变量开始看起来是最有吸引力的选择。