2012-06-15 71 views

回答

7

不可能在編譯時像創建數組那樣創建數組。那是因爲它不是「編譯時間常量」。相反,你可以這樣做:

static NSArray *tArray = nil; 

-(void)viewDidLoad { 
    [super viewDidLoad]; 

    tArray = [NSArray arrayWithObjects:@"A", @"B", @"C", nil]; 
} 

如果你有這樣的預編譯的,那麼我想你可以創建一個測試項目,創建一個數組(或其他物體)你需要,填充它,那麼它的真正重要的使用NSKeyedArchiver(將其保存到文件)將其序列化,然後將該文件包含在您的應用程序中。然後您將需要使用NSKeyedUnarchiver來解壓縮使用的對象。我不確定這兩種方法之間的性能差異。這種方法的一個優點是,如果你需要初始化一個包含很多對象的數組,那麼你沒有大塊代碼。

+0

預編譯並不重要,因此您的解決方案對我來說非常合適。謝謝! – MoreFamed

+0

這會在每次執行'viewDidLoad'時創建數組,'nil'測試會很好。 – Cristik

-1

使用本

NSArray *array = [NSArray arrayWithObjects:str1,str2, nil]; 
+1

值得注意的是,'str1,str2 ...'可以是像'@「一些字符串」'的NSString文字,就像它們將用於C數組初始化符一樣。我*認爲*這些字符串將在編譯時在圖像中插入。不要以爲你可以在運行時以外的地方初始化數組,但是,至少不能沒有一些醜陋的序列化黑客攻擊。 – walkytalky

+0

這對我不起作用。我做了 NSArray * a = [NSArray arrayWithObjects:@「foo」,@「bar」,@「baz」,nil]; 和編譯器說「初始化器元素不是編譯時常量」。我需要在模塊中的幾個例程之間共享數組,所以我想要在任何例程之外聲明和填充數組...... – MoreFamed

+0

-1正如MoreFamed指出的那樣,這絕對不會以他需要的方式工作。如果只需要用單一方法訪問'array',你的代碼*就會工作,但他需要在整個班級中訪問它。 – FreeAsInBeer

-2

據我瞭解,你需要一個一維數組 您可以使用NSArray ..類方法例如

NSString *yourString; 
NSArray *yourArray = [[NSArray alloc] initWithObjects:yourString, nil]; 

如果您需要更多,請提供一些關於你的問題的更多細節

+0

-1你的答案與@ sheraza's有相同的問題。它不會提供整個班級的數組訪問權限。 – FreeAsInBeer

-2

簡單:NSArray<NSString*> *stringsArray = @[@"Str1", @"Str2", @"Str3", ...];現代ObjectiveC允許泛型和文字數組。

如果您想要更短的代碼,然後NSArray *stringsArray = @[@"Str1", @"Str2", @"Str3", ...];,因爲泛型是可選的,只有在訪問數組元素時纔有幫助,因此您可以稍後在代碼中將其轉換回模板化數組。

+1

我無法將其編譯爲常量/靜態。 – Andy

+0

是的,它不會工作,因爲這是一個運行時執行的構造。 – Cristik