如何在Objective-C中声明一个字符串类型的二维数组?

25
在Objective-C中声明一个字符串类型的二维数组应该怎么做呢?
```objc NSString *myArray[row][col]; ```

如果你在谈论 NS(Mutable)Array,你不需要“声明”它。NSArray 没有分配的内容类型,所以你只需声明外部数组。如何使用它取决于你。 - Hot Licks
3个回答

44

首先,你可以考虑使用一个类来保存内部数组的字符串,或者从 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内存管理的更多信息。


12

如果您想声明和初始化一个二维字符串数组,可以这样做:

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];

这样做的好处是使你获得了一个不可变的数组。


嗨,Steve McLeod,如果我的数组长这样,我该如何获取“item 1-1”的值? - Cong Tran
1
[[myArray objectAtIndex:1] objectAtIndex:1] - Hackmodford

2

我可能在自我宣传,但我编写了一个对NSMutableArray进行了封装,使其易于用作2D数组的工具包。 它可以在GitHub上找到,名为CRL2DArray,链接如下:https://github.com/tGilani/CRL2DArray


作为一名Android(Java)开发者,我很惊讶在obj-C中创建一个2D数组是多么困难,感谢您提供的非常有用的GitHub资源! - Lazar Kukolj
唯一的问题是我希望有更多内置方法,就像普通的NSArray一样,例如count等。但现在我只能手动完成它! - Lazar Kukolj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接