如何在Objective-C中声明一个stringtypes的二维数组?
如何在Objective-C中声明一个stringtypes的二维数组?
首先,你可以考虑使用一个类来保存你的内部数组的string,或者从一个plist文件中加载它(在这个文件中很容易制作一个二维数组的string)。
对于直接声明,您有几个选项。 如果你想使用NSArray,你必须手动创build这样的结构:
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风格的数组,你需要做这样的事情来replace一个数组:
[strings[i][j] release]; strings[i][j] = [newString retain];
另一个区别是你可以把nil放在C风格的数组中,而不是NSArrays – 你需要使用NSNull。 另外看看堆栈溢出问题cocoa:内存pipe理与NSString有关NSString内存pipe理的更多信息。
如果你想声明和初始化一个二维数组的string,你可以这样做:
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
先前易于使用作为二维数组。 它在GitHub上作为CRL2DArray
在这里提供。 https://github.com/tGilani/CRL2DArray