2009-03-12 80 views

Trả lời

44

Trước tiên, bạn có thể xem xét sử dụng một lớp để giữ các chuỗi trong mảng của bạn hoặc tải nó từ tệp plist (trong đó dễ dàng tạo chuỗi 2d).

Để khai báo trực tiếp, bạn có một vài tùy chọn. Nếu bạn muốn sử dụng một NSArray, bạn sẽ phải tự tạo ra các cấu trúc như thế này:

NSMutableArray *strings = [NSMutableArray array]; 
for(int i = 0; i < DESIRED_MAJOR_SIZE; i++) 
{ 
    [strings addObject: [NSMutableArray arrayWithObject:@"" count:DESIRED_MINOR_SIZE]]; 
} 

Hoặc, sử dụng literals mảng, bạn có thể nhận được một bất biến phiên bản như thế này:

NSArray *strings = @[ @[ @"A", @"B", @"C" ], @[ @"D", @"E", @"F" ], @[ @"G", @"H", @"I" ] ] 

sau đó bạn có thể sử dụng nó như thế này:

NSString *s = [[strings objectAtIndex:i] objectAtIndex:j]; 

Đây là một chút vụng về để khởi tạo, nhưng nó là con đường để đi nếu bạn muốn sử dụng các phương pháp NSArray.

Một cách khác là sử dụng C mảng:

NSString *strings[MAJOR_SIZE][MINOR_SIZE] = {0}; // all start as nil 

Và sau đó sử dụng nó như thế này:

NSString *s = strings[i][j]; 

Đây là ít lúng túng, nhưng bạn phải cẩn thận để giữ lại/sao chépphát hành các giá trị khi bạn đặt chúng vào và xóa chúng khỏi mảng. (! Trừ khi bạn đang sử dụng ARC, tất nhiên) NSArray sẽ làm việc này cho bạn, nhưng với mảng C-phong cách, bạn cần phải làm điều gì đó như thế này để thay thế một mảng:

[strings[i][j] release]; 
strings[i][j] = [newString retain]; 

Sự khác biệt khác là bạn có thể đặt nil trong mảng kiểu C, nhưng không phải là NSArrays - bạn cần sử dụng NSNull cho điều đó. Ngoài ra, hãy xem câu hỏi về Stack Overflow Cocoa: Memory management with NSString để biết thêm về quản lý bộ nhớ NSString.

+2

+1 để tiết kiệm cho tôi rất nhiều đánh máy. – Abizern

12

Nếu bạn muốn khai báo và khởi tạo một mảng hai chiều của chuỗi, bạn có thể làm điều này:

NSArray *myArray = [NSArray arrayWithObjects: 
         [NSArray arrayWithObjects:@"item 1-1", @"item 1-2", nil], 
         [NSArray arrayWithObjects:@"item 2-1", @"item 2-2", nil], 
         [NSArray arrayWithObjects:@"item 3-1", @"item 3-2", nil], 
         [NSArray arrayWithObjects:@"item 4-1", @"item 4-2", nil], 
         nil]; 

này có lợi ích đem lại cho bạn một mảng bất biến.

+0

hi Steve McLeod, làm thế nào tôi có thể nhận được giá trị của "mục 1-1" nếu tôi có myArray như thế này. –

+1

[[myArray objectAtIndex: 1] objectAtIndex: 1] – Hackmodford

2

Tôi có thể tự quảng cáo nhưng tôi đã viết một trình bao bọc trên NSMutableArray trước khi sử dụng dễ dàng dưới dạng mảng 2D. Nó có sẵn trên GitHub dưới dạng CRL2DArray tại đây. https://github.com/tGilani/CRL2DArray

+0

Xuất phát từ Android (Java) Tôi ngạc nhiên về việc tạo ra một mảng 2D trong obj-C rất khó khăn như thế nào, cảm ơn GitHub rất hữu ích! –

+0

Vấn đề duy nhất là tôi ước có nhiều phương pháp được xây dựng sẵn hơn mà một NSArray bình thường giống như đếm, vv Nhưng bây giờ tôi sẽ tự làm điều đó! –

Các vấn đề liên quan