2009-08-08 28 views

回答

26

有幾種不同的方法可以做到這一點:

  1. 相反,聲明爲一個全局變量,在一個單獨的對象包裝它的,然後請有可在任何地方的單身(由#importing的.h文件)

  2. 創建一個.h文件,如「Globals.h」。在.H,聲明你的數組作爲extern NSMutableArray * myGlobalArray;然後在您的應用程序在其他地方(在AppDelegate中是個好地方),只是做:myGlobalArray = [[NSMutableArray alloc] init];然後你需要的地方的陣列,只是#import "Globals.h"

  3. 這就好比#2 ,但沒有全局標題。您可以在項目的.pch文件的#ifdef __OBJC__塊內將陣列定義爲extern NSMutableArray *myGlobalArray;。 .pch文件是一個頭文件,它會自動#imported到項目中的每個文件中。

每種方法都有優缺點。我在不同的情況下在不同的時間使用了所有三個。我想說單例方法可能是最合適的,因爲它對初始化,訪問限制和內存管理來說最爲靈活。但是,如果您不需要這些,它可能是不必要的。

如果您有許多「全局」變量不希望公開給項目中的每個文件,則選項2很不錯。您可以#將其導入需要的地方。但是,這種方法(以及#3)將聲明與初始化分離(即,該對象不是在聲明的位置附近創建的)。有人可能會認爲這是不正確的,他們可能是正確的。

選項#3是很好的,因爲那樣你就永遠不必記得#進口任何東西。但是,它提出了與選項#2相同的問題。

+0

嗨,我已經使用了第三個選項,但是當我使用靜態外部NSMutableArray * myGlobalA rray; **在聲明說明符中出現**多個存儲類的錯誤** – rptwsthi 2011-04-05 11:06:40

+1

@rptwsthi對不起。只要刪除「靜態」位。 – 2011-04-05 14:19:03

+0

上次我沒能從第三種方式獲得理想的迴應,但這次我做到了。謝謝你這個不錯的帖子。 :) – rptwsthi 2011-10-14 09:15:24

8

第4個答案是,聲明數組在UIApplicationDelegate並通過

[[[UIApplication sharedApplication] delegate] myArray]; 

對於次訪問它時,我只需要全局對象了一把,我發現這是做的最簡單,最徹底的方法。

+6

+1這也是一個好方法。唯一的警告是它會產生一個編譯器警告,因爲 - [UIApplication delegate]返回一個id 類型的對象,它沒有「myArray」方法。解決方法是將它投射出去,但是這使得該線更加難於準備:'[(MyAppDelegate *)[[UIApplication sharedApplication] delegate] myArray];' – 2009-08-08 16:36:49

+1

另外,投射它意味着您還需要#import MyAppDelegate頭文件。 – 2009-08-08 16:37:21

+0

我使用Xcode 4.3。你提到的情況會強制出錯,而不僅僅是警告。 – Philip007 2012-08-20 13:44:53

2

如果您正在考慮爲應用程序存儲某種共享首選項,請使用[NSUserDefaults sharedDefaults]來保存可在應用程序中使用的簡單數據。如果你正在存儲瞬態數據,那麼'靜態'方法將與其他地方一樣。

然而,使用類訪問器(如NSUserDefaults)的單例對象方法可能更好,然後提供實例訪問器方法來獲取您的數據。這樣,您就可以將自己與未來潛在的數據結構變化隔離開來。然後你可以像上面那樣使用一個靜態變量,但是在.m文件中(因此你不需要'extern'定義)。它通常看起來像:

static Foo *myDefault = nil; 
@implementation Foo 
+(Foo)defaultFoo { 
    if(!myDefault) 
    myDefault = [[Foo alloc] init]; // effective memory leak 
    return myDefault; 
} 
@end 

然後你必須實例訪問器,並把它們作爲[[美孚defaultFoo] myArray的],可以從應用程序的任何部分進行訪問,並且沒有任何編譯時錯誤。

1

這裏的每個人似乎都有一個隱含的,省略的第一行:「你可以做到這一點K & R C風格,或...「

是的,你仍然可以做到這一點的C風格

在文件1:

NSArray *MyArray; 

在文件2:

extern NSArray *MyArray; 

播放明顯的這裏,船長

+1

這並不是那麼明顯,我認爲對於新興的Obj-C開發者來說沒有C經驗是相當普遍的。 – kubi 2011-04-08 10:49:12

1

關於戴夫的答案在這裏:

這就像#2,但沒有全局標題。你可以定義你的數組爲靜態外部NSMutableArray * myGlobalArray;在項目的.pch文件的#ifdef OBJC塊內。 .pch文件是一個頭文件,它會自動#imported到項目中的每個文件中。

typedef是一個存儲類,static是存儲類,只能在一個存儲類中定義對象。拿出「靜態」將允許應用程序與您的答案編譯上面。

0

有幾種可能性。最受歡迎:

1使用單獨的對象 - http://www.galloway.me.uk/tutorials/singleton-classes/

2聲明它在應用程序委託:

@interface Your_App_Delegate : UIResponder <UIApplicationDelegate> 

@property (nonatomic, strong) NSArray *array; 
    . . . 

和訪問:

((Your_App_Delegate*)[[UIApplication sharedApplication] delegate]).array; 

3使用NSUserDefault