2012-06-15 8 views

Trả lời

7

Không thể tạo một mảng giống như bạn đang làm lúc biên dịch. Đó là bởi vì nó không phải là "hằng số thời gian biên dịch." Thay vào đó, bạn có thể làm một cái gì đó như:

static NSArray *tArray = nil; 

-(void)viewDidLoad { 
    [super viewDidLoad]; 

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

Nếu nó thực sự quan trọng là bạn phải biên dịch sẵn này, sau đó tôi đoán bạn có thể tạo ra một dự án thử nghiệm, tạo mảng (hoặc bất kỳ đối tượng), bạn cần, điền vào nó, sau đó serialize nó bằng cách sử dụng NSKeyedArchiver (mà sẽ lưu nó vào một tập tin), và sau đó bao gồm tập tin đó trong ứng dụng của bạn. Sau đó, bạn sẽ cần sử dụng NSKeyedUnarchiver để hủy lưu trữ đối tượng để sử dụng. Tôi không chắc chắn sự khác biệt về hiệu suất là gì giữa hai cách tiếp cận này. Một ưu điểm của phương thức này là bạn không có một khối mã lớn nếu bạn cần khởi tạo một mảng bao gồm rất nhiều đối tượng.

+0

Nó không phải là quan trọng để có nó biên dịch trước, do đó, giải pháp của bạn hoạt động hoàn hảo cho tôi. Cảm ơn! – MoreFamed

+0

Điều này tạo ra mảng mỗi khi 'viewDidLoad' thực thi, một phép thử' nil' sẽ tốt. – Cristik

-1

sử dụng này

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

Đáng chú ý rằng 'str1, str2 ...' có thể là NSString các chữ như '@" một số chuỗi "', giống như cách chúng tạo cho bộ khởi tạo mảng C. Tôi nghĩ * các chuỗi như vậy sẽ được inited tại thời gian biên dịch trong hình ảnh. Đừng nghĩ rằng bạn có thể init bản thân mảng khác với thời gian chạy, mặc dù, ít nhất là không có một số hack serialization xấu xí. – walkytalky

+0

Điều này không hiệu quả đối với tôi. Tôi đã làm NSArray * a = [mảng NSArrayWithObjects: @ "foo", @ "bar", @ "baz", nil]; và trình biên dịch nói "Phần tử Initializer không phải là hằng số biên dịch". Tôi cần phải chia sẻ mảng giữa một số thói quen trong một mô-đun, vì vậy tôi muốn mảng được khai báo và điền vào bên ngoài bất kỳ thường lệ nào ... – MoreFamed

+0

-1 Như MoreFamed chỉ ra, điều này sẽ hoàn toàn không hoạt động theo cách anh ta cần. Mã của bạn * sẽ * làm việc nếu anh ta chỉ cần truy cập vào 'mảng' trong một phương thức duy nhất, nhưng anh ta cần truy cập vào nó trong suốt lớp của mình. – FreeAsInBeer

-2

Theo như tôi hiểu bạn cần một mảng một dimentional Bạn có thể sử dụng phương pháp loại NSArray .. Ví dụ

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

Nếu bạn cần biết thêm, xin vui lòng cung cấp thêm một số chi tiết về vấn đề của bạn

+0

-1 Câu trả lời của bạn có cùng vấn đề với @ sheraza. Nó sẽ không cung cấp quyền truy cập vào mảng trên toàn bộ lớp. – FreeAsInBeer

-2

Đơn giản như vậy: NSArray<NSString*> *stringsArray = @[@"Str1", @"Str2", @"Str3", ...]; ObjectiveC hiện đại cho phép generics và mảng chữ.

Nếu bạn muốn mã ngắn hơn, sau đó là NSArray *stringsArray = @[@"Str1", @"Str2", @"Str3", ...];, vì các generics là tùy chọn và chỉ trợ giúp khi truy cập các phần tử mảng, do đó bạn có thể sau đó mã được đưa trở lại mảng templatized.

+1

Tôi không thể biên dịch nó thành hằng số/tĩnh. – Andy

+0

Có, nó sẽ không hoạt động vì đó là thời gian chạy thi công. – Cristik