2012-07-25 26 views
0

上下文: 我推廣了我剛剛繼承的iOS項目的一些方面。我想要的一件事是從應用程序中的任何地方訪問的數據結構,用戶控件可以訪問應用程序特定的樣式信息(例如UIColor定義等)。正確放置'全局'數據結構的地方

問題:如果我定義含有必須是「全局」訪問數據的數據結構,其中被認爲是實例化這個對象,什麼是讓其他對象獲得基準以正確的方式在正確的地方到它?有點研究可以看出以下幾種選擇:

  • 創建數據結構作爲我的AppDelegate的屬性;在applicationDidFinishLaunching上初始化;通過((myAppDelegate *)[UIApplication sharedApplication].delegate).getStyleDefs訪問它。
  • 使結構成爲一個全局單例(從AppDelegate實例化延遲加載或熱切地加載)。

我還有哪些其他選擇?

回答

2

Matt Gallagher撰寫的關於Singletons, AppDelegates and top-level data的文章是Objective C中處理這個問題的各種方式的優點和缺點的很好的參考。非常簡短的總結是:使用單例。

對在其他地方使用的單身的主要論點大致分爲兩個陣營:

  1. 你做錯了擺在首位,如果你需要這樣的一個全局對象的。這通常是很好的建議,但似乎你已經決定走這條路。請注意,應用程序委託模式只是劫持一個單身Cocoa自動爲您創建並在其上掛載更多的東西。所以它不是一個單身人士的休息。
  2. 在其他語言中,單身人士不應該是真正的單身人士。傳統的單例實際上強制禁止在應用程序中只能有一個實例化。在Objective C中,我們大多數情況下使用單例類型,其中有一個通過類方法爲您創建的默認對象,但是如果您想要,可以創建更多。 Apple的類通常使用這個。如果預計您不會創建更多的類方法,則以default*開頭,如果您的方法可能以shared*開頭。

注意實例你單身最好的現代方法是使用大中央調度,如在此note on Objective C singletons描述。

+0

是的,我會閱讀完全相同的文章,他是一個很好的例子。麻煩的是,我也讀過一些(非常熱情!)將全球單身族完全妖魔化的概念文章和博客!好像Objective-C的社會是不是對他們的其他一些人!..謝謝你的投入在這裏:) – sjwarner 2012-07-25 09:47:16

+1

單身人士在某些情況下是有用的,和Cocoa使用它們相當多的(例如NSUserDefaults的)。 – Andrei 2012-07-25 10:26:40

+1

@sjwarner我在我的答案中增加了一些關於我對單身辯論的利弊的看法。 – 2012-07-25 17:10:52

0

也許會創建一個名爲SharedConstants(.h/.m)的單獨文件,並在其中具有所有應用程序範圍內的常量。

裝上去像.m版本的文件

#define sharedColor [UIColor colorWithRed...]

,然後你就可以在包括SharedConstants.h文件中的任何其它類使用它。