我有一个简单的问题:
如何从Objective C方法返回C风格的二维数组,其中包含指向我可以使用myArray [x] [y] .someProperty或[myArray [x] [y] someMethodCall解决的各种对象的指针: myArgument]我猜想像NSData这样的东西需要用来“打包”返回数据,这将在另一端解包。
需要像这样处理的对象作为1维NSMutableArray存储在Objective C类内部,其容量等于width * height。我知道在这里必须发生一些指针魔术,以便在C风格的2D数组和实际的1维NSMutableArray之间进行转换。
这可能吗?
干杯, -Keven Tipping
答案 0 :(得分:3)
C(或Objective-C)函数无法返回数组。但是,它可以返回包含数组的结构:
struct array {
int v[5][5];
};
struct array f() {
struct array a;
// fill 'a' here
a.v[0][0] = 1;
...
return a;
}
答案 1 :(得分:0)
声明Obj-C对象的C风格多维数组并访问
没有问题n = myArray[x][y].myProperty;
或做
[myArray[x][y] someMethod: someArgument];
就像使用一个变量,而不是数组的元素。但这是一个简单的C风格的对象引用数组,而不是一个对象。
你想要不同的东西。您的数组是类中的数组,您想要访问这些元素。要访问元素,请按照一维数组进行操作,例如
a = [my2DimArray objectAtIndexX: x indexY: y];
和
[my2DimArray replaceObjectAtIndexX: x indexY: y withObject: myObject];
或
[my2DimArray addRow: myNSArray];
和
RV2DimArray *my2DimArray = [RV2DimArray arrayWithX: 17 Y: 39];
或者,如果你想要更多:
RVMultiDimArray *a = [[RVMultiDimArray alloc] initWithDimensions: 4, 4, 8, 0];
等...
答案 2 :(得分:0)
如果你真的需要能够像[x] [y]那样索引并且你关心内存管理,也许你可以创建一个包装类,在初始化时,mallocs是一个id **(或者相应的类,如果你提前知道长度为x_max,并用长度为y_max的malloc填充每个x。然后,显然,它都需要在dealloc方法中释放。你可以用wrapper.array [x] [y]调用它。您甚至可以存储长度,以便您可以向包装器询问其数组的大小。
有一件事:我不确定malloc与苹果的[分配比较]有多好。可能想先检查一下。
答案 3 :(得分:0)
您可以设置obj-c函数以返回NSArray。在NSArray里面是一个NSArray。所以就像返回NSArray数组一样
yourNSArray = [self getArray]; //returns an array of array
获得NSArray后,可以将其转换为二维C风格阵列:
c[0][0] = [[[yourNSArray objectAtIndex:0] objectAtIndex:0] intValue];
c[0][1] = [[[yourNSArray objectAtIndex:0] objectAtIndex:1] intValue];