25

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

4

3 回答 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];

另一个区别是你可以将 nil 放在 C 风格的数组中,但不能放在 NSArrays 中——你需要为此使用 NSNull。另请查看 Stack Overflow 问题Cocoa: Memory management with NSString以了解有关 NSString 内存管理的更多信息。

于 2009-03-12T11:15:12.903 回答
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];

这样做的好处是为您提供了一个不可变数组。

于 2009-07-08T14:40:42.263 回答
2

我可能是在做自我广告,但我写了一个包装器,以NSMutableArray方便用作 2D 数组。它在 GitHub 上可用,如下所示CRL2DArrayhttps://github.com/tGilani/CRL2DArray

于 2013-04-21T10:21:15.577 回答