2010-10-13 15 views

回答

2

您可以將它作爲一個常用對象(如應用程序委託)中的屬性保留。

假設其非原子,保留類型屬性,然後訪問它想:

myAppDelegate *del = [[UIApplication sharedApplication] delegate]; 
del.arrayDisplay = [NSArray arrayWithObjects:@"Daily",@"Weekly", @"Monthly", nil]; 

但如果你打算改變它,你可能需要一個NSMutableArray。

+1

Nooooo!創建一個單例。不要污染與應用程序級事件處理無關的應用程序委託。 – 2010-10-13 22:43:41

+0

一個很好的觀點。辛格爾頓會更優雅。 – Ben 2010-10-13 22:51:02

+0

「真正的」單例幾乎總是錯...... – 2010-10-13 23:35:11

0

您可以在陣列保存爲您的項目中的plist並在每個需要的地方與

NSArray *arrayDisplay = [[NSArray alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"myArrayName" ofType:@"plist"]]; 

只要你不需要改變在這兩個地方,而值這將工作場所加載它該程序實際上正在運行。

1

如果您的應用程序很簡單,請考慮您正在訪問的數據可以通過單例的全局實例訪問的Singleton模型。 link text

2

考慮編寫一個類方法,甚至是一個懶惰地創建數組的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; 
} 

一類方法的優點雖然是你可以在子類中覆蓋它,如果這可能證明是方便的。

+0

當我這樣做時,我推薦'assert([NSThread isMainThread]);''除非你希望從多個線程中調用它(在這種情況下,你需要做它線程安全的)。 – 2010-10-13 23:36:33

+0

類方法的另一個優點是它比一些浮動的C函數具有更明顯的「所有者」。 – 2010-10-13 23:40:48

+0

只是想知道如果你發現使用斷言更喜歡使用'@ synchronized'。 – jlehr 2010-10-13 23:42:50

1

與其使用Singleton方法,不如考慮確定應用程序的對象層次結構中的哪個對象應擁有此數組,然後將該引用傳遞到需要的位置(請參閱:dependency injection)。

0

如果你不介意的全局變量,你可以在加載時實例化它們:

@interface FooClass : ... { 
    ... 
} 

static NSArray * FooClass_timescale; 

@end 


@implementation FooClass 

+(void)load { 
    FooClass_timescale = [[NSArray alloc] initWithObjects:@"Daily", @"Weekly", @"Monthly", nil]; 
} 

@end 

我喜歡做這個的時候有事情我想要實例(例如顏色樁主題/皮膚/品牌/無論),因爲它比寫一個函數返回它們更短。當然,可能會意外地修改全局變量,但我從來沒有管理過這個(通常我忘記保留)。

相關問題