【问题标题】:How do I return a 2-dimensional C style array from an Objective C method?如何从 Objective C 方法返回二维 C 样式数组?
【发布时间】:2011-11-07 06:54:18
【问题描述】:

我有一个小问题:

如何从 Objective C 方法返回 C 样式的二维数组,其中包含指向可以使用 myArray[x][y].someProperty 或 [myArray[x][y] someMethodCall 寻址的各种对象的指针:我的论点]?我猜需要使用类似 NSData 的东西来“打包”返回数据,而这些数据将在另一端被解包。

需要像这样处理的对象在 Objective C 类内部存储为一维 NSMutableArray,其容量等于宽度*高度。我知道这里必须发生一些指针魔术来在 C 样式的 2D 数组和实际的 1 维 NSMutableArray 之间进行转换。

这可能吗?

干杯, -凯文小费

【问题讨论】:

  • 可能值得推荐的是,与其尝试返回 2D 数组,不如让用户将 2D 缓冲区传递给函数,然后将数据复制到该缓冲区中(即更改 @ 987654321@ 到 func(&x);,但对于数组,& 并不完全正确,具体取决于您声明它的方式。

标签: objective-c c methods return


【解决方案1】:

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;
}

【讨论】:

    【解决方案2】:

    如果您确实需要能够像 [x][y] 那样进行索引并且您关心内存管理,也许您可​​以创建一个包装类,在初始化时,mallocs 一个 id**(或适当的类,如果你提前知道)长度为 x_max,并用长度为 y_max 的 malloc 填充每个 x。那么,显然,这一切都需要在dealloc方法中释放。你可以用 wrapper.array[x][y] 来调用它。你甚至可以存储长度,这样你就可以询问包装器它的数组有多大。

    有一件事:我不确定 malloc 与苹果的 [Class alloc] 配合得如何。可能要先检查一下。

    【讨论】:

      【解决方案3】:

      声明一个C风格的Obj-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];
      

      等等……

      【讨论】:

        【解决方案4】:

        你可以设置你的 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];

        【讨论】:

          猜你喜欢
          • 2015-09-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-19
          • 2012-11-03
          • 1970-01-01
          • 1970-01-01
          • 2021-03-29
          • 2011-07-09
          相关资源
          最近更新 更多