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

如何在Objective-C中声明字符串类型的二维数组?,objective-c,arrays,nsstring,Objective C,Arrays,Nsstring,如何在Objective-C中声明字符串类型的二维数组

如何在Objective-C中声明字符串类型的二维数组
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];
NSString *s = strings[i][j];
然后您可以这样使用它:

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];
NSString *s = strings[i][j];
这在初始化时有点尴尬,但如果您想使用NSArray方法,这是一种方法

另一种方法是使用C数组:

NSString *strings[MAJOR_SIZE][MINOR_SIZE] = {0}; // all start as nil
然后像这样使用它:

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];
NSString *s = strings[i][j];
这就不那么麻烦了,但在将值放入数组并从数组中删除时,必须小心地保留/复制和释放值。(当然,除非您使用的是ARC!)NSArray可以为您这样做,但对于C样式的阵列,您需要执行以下操作来替换阵列:

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

另一个区别是,您可以将nil放在C样式的数组中,但不能将nsarray放在其中,您需要使用NSNull。还可以查看堆栈溢出问题,了解有关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
的形式在此处找到

嗨,Steve McLeod,如果我有这样的myArray,我怎么能得到“item 1-1”的值。[[myArray objectAtIndex:1]objectAtIndex:1]如果你说的是NS(可变)数组,你不需要“声明”它。NSArray没有指定的内容类型,因此只需声明外部数组。如何使用它取决于您。来自Android(Java),我很惊讶在obj-C中创建2D数组有多么困难,感谢非常有用的GitHub先生!唯一的问题是,我希望有更多的内置方法,一个正常的NSArray有像计数等,但现在我只是手动做它!