我有以下數組。iPhone,我需要重用一個在不同視圖中具有常量值的NSArray,怎麼樣?
NSArray *arrayDisplay = [[NSArray alloc] initWithObjects:@"Daily",
@"Weekly", @"Monthly", nil];
我需要在兩個視圖中使用它,我擔心我可能會做出更改並在將來忘記更改其他值。所以我想宣佈一次並重新使用它。
我該怎麼做?
我有以下數組。iPhone,我需要重用一個在不同視圖中具有常量值的NSArray,怎麼樣?
NSArray *arrayDisplay = [[NSArray alloc] initWithObjects:@"Daily",
@"Weekly", @"Monthly", nil];
我需要在兩個視圖中使用它,我擔心我可能會做出更改並在將來忘記更改其他值。所以我想宣佈一次並重新使用它。
我該怎麼做?
您可以將它作爲一個常用對象(如應用程序委託)中的屬性保留。
假設其非原子,保留類型屬性,然後訪問它想:
myAppDelegate *del = [[UIApplication sharedApplication] delegate];
del.arrayDisplay = [NSArray arrayWithObjects:@"Daily",@"Weekly", @"Monthly", nil];
但如果你打算改變它,你可能需要一個NSMutableArray。
您可以在陣列保存爲您的項目中的plist並在每個需要的地方與
NSArray *arrayDisplay = [[NSArray alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"myArrayName" ofType:@"plist"]];
只要你不需要改變在這兩個地方,而值這將工作場所加載它該程序實際上正在運行。
如果您的應用程序很簡單,請考慮您正在訪問的數據可以通過單例的全局實例訪問的Singleton模型。 link text
考慮編寫一個類方法,甚至是一個懶惰地創建數組的C函數。例如,這裏有一個類的方法,你想要做什麼:
+ (NSArray *)frequencyChoices
{
static NSArray *choices;
if (choices == nil)
{
choices = [[NSArray alloc] initWithObjects:
@"Daily", @"Weekly", @"Monthly", nil];
}
return choices;
}
寫相同的功能C函數使得它更普遍:
NSArray *frequencyChoices(void)
{
static NSArray *choices;
if (choices == nil)
{
choices = [[NSArray alloc] initWithObjects:
@"Daily", @"Weekly", @"Monthly", nil];
}
return choices;
}
一類方法的優點雖然是你可以在子類中覆蓋它,如果這可能證明是方便的。
當我這樣做時,我推薦'assert([NSThread isMainThread]);''除非你希望從多個線程中調用它(在這種情況下,你需要做它線程安全的)。 – 2010-10-13 23:36:33
類方法的另一個優點是它比一些浮動的C函數具有更明顯的「所有者」。 – 2010-10-13 23:40:48
只是想知道如果你發現使用斷言更喜歡使用'@ synchronized'。 – jlehr 2010-10-13 23:42:50
與其使用Singleton方法,不如考慮確定應用程序的對象層次結構中的哪個對象應擁有此數組,然後將該引用傳遞到需要的位置(請參閱:dependency injection)。
如果你不介意的全局變量,你可以在加載時實例化它們:
@interface FooClass : ... {
...
}
static NSArray * FooClass_timescale;
@end
@implementation FooClass
+(void)load {
FooClass_timescale = [[NSArray alloc] initWithObjects:@"Daily", @"Weekly", @"Monthly", nil];
}
@end
我喜歡做這個的時候有事情我想要實例(例如顏色樁主題/皮膚/品牌/無論),因爲它比寫一個函數返回它們更短。當然,可能會意外地修改全局變量,但我從來沒有管理過這個(通常我忘記保留)。
Nooooo!創建一個單例。不要污染與應用程序級事件處理無關的應用程序委託。 – 2010-10-13 22:43:41
一個很好的觀點。辛格爾頓會更優雅。 – Ben 2010-10-13 22:51:02
「真正的」單例幾乎總是錯...... – 2010-10-13 23:35:11