在Objective-C中声明一个字符串类型的二维数组应该怎么做呢?
```objc NSString *myArray[row][col]; ```
```objc NSString *myArray[row][col]; ```
首先,你可以考虑使用一个类来保存内部数组的字符串,或者从 plist 文件中加载它(在这种情况下很容易创建一个二维字符串数组)。
对于直接声明,你有几个选项。如果你想使用 NSArray,你需要手动创建结构,如下所示:
NSMutableArray *strings = [NSMutableArray array];
for(int i = 0; i < DESIRED_MAJOR_SIZE; i++)
{
[strings addObject: [NSMutableArray arrayWithObject:@"" count:DESIRED_MINOR_SIZE]];
}
或者,使用数组字面量,您可以像这样获取一个不可变版本:
NSArray *strings = @[ @[ @"A", @"B", @"C" ], @[ @"D", @"E", @"F" ], @[ @"G", @"H", @"I" ] ]
你可以像这样使用它:
NSString *s = [[strings objectAtIndex:i] objectAtIndex:j];
如果你想使用NSArray方法,这种初始化方式可能有点棘手,但这是正确的方法。
另一种选择是使用C数组:
NSString *strings[MAJOR_SIZE][MINOR_SIZE] = {0}; // all start as nil
然后像这样使用它:
NSString *s = strings[i][j];
这样做会少些尴尬,但是你需要小心地保留/复制和释放从数组中取出或加入的值。如果你使用ARC,那当然不用担心!NSArray 会自动处理这一切,但对于C语言风格的数组,你需要像这样替换一个数组:
[strings[i][j] release];
strings[i][j] = [newString retain];
另一个区别是,你可以在C-style数组中放置nil,但不能在NSArrays中这样做 - 你需要使用NSNull。另外,查看Stack Overflow问题Cocoa: Memory management with NSString,了解有关NSString内存管理的更多信息。
如果您想声明和初始化一个二维字符串数组,可以这样做:
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];
这样做的好处是使你获得了一个不可变的数组。
我可能在自我宣传,但我编写了一个对NSMutableArray
进行了封装,使其易于用作2D数组的工具包。 它可以在GitHub上找到,名为CRL2DArray
,链接如下:https://github.com/tGilani/CRL2DArray