如何从Objective C方法返回二维C样式数组?

时间:2011-08-31 02:10:52

标签: objective-c c methods return

我有一个简单的问题:

如何从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

4 个答案:

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