放置“全球”数据结构的正确位置

时间:2012-07-25 09:23:10

标签: objective-c

上下文 我概括了我刚刚继承的iOS项目的一些方面。我想要的一件事是可以从应用程序中的任何位置访问的数据结构,其中用户控件可以访问特定于应用程序的样式信息(UIColor定义等)。

问题:如果我已经定义了一个包含需要“全局”访问的数据的数据结构,那么它被认为是实例化此对象的正确位置,以及其他对象的正确方法获得参考?一些研究提出了以下选择:

  • 将数据结构创建为AppDelegate的属性;在applicationDidFinishLaunching上初始化它;通过((myAppDelegate *)[UIApplication sharedApplication].delegate).getStyleDefs
  • 访问它
  • 使结构成为一个全局单例(通过AppDelegate实例化来延迟加载或急切地。)

我还有其他选择吗?

2 个答案:

答案 0 :(得分:2)

Matt Gallagher关于Singletons, AppDelegates and top-level data的文章是对目标C中处理此问题的各种方法的利弊的一个很好的参考。非常简短的总结是:使用单身人士。

其他地方针对单身人士的主要论据大致分为两个阵营:

  1. 如果您需要这种全局对象,那么您首先做错了。这通常是很好的建议,但似乎您已经决定走这条路。请注意,app委托模式只是劫持单个Cocoa自动为您创建并在其上挂更多东西。所以它并非真正脱离单身人士。
  2. 单身人士不应该是其他语言意义上的真正的单身人士。传统的单身人士实际上强制禁止只有一个人可以在你的应用程序中实例化。在Objective C中,我们主要使用单例,其中有一个通过类方法为您创建的默认对象,但如果您愿意,可以创建更多。 Apple的课程相当普遍。如果预计您不会创建更多,则类方法以default*开头,并且在您可能以shared*开头的情况下。
  3. 注意要实例化你的单身人士,最好的现代方法是使用Grand Central Dispatch,如note on Objective C singletons中所述。

答案 1 :(得分:0)

也许创建一个名为SharedConstants(.h/.m)的单独文件,并在那里提供所有应用程序范围的常量。

添加类似

的内容

#define sharedColor [UIColor colorWithRed...]

在文件的.m版本中,然后您就可以在包含SharedConstants.h文件的任何其他类中使用它。