【问题标题】:How can I wrap a 3D array of a primitive type in an NSArray?如何将原始类型的 3D 数组包装在 NSArray 中?
【发布时间】:2015-02-03 13:31:52
【问题描述】:

我有以下代码,我试图将整数的 3D 数组包装在 NSArray 中,因为我无法在 C 中返回多维数组。谁能建议我如何以一种允许轻松访问数组的方式实现它函数返回后?

-(NSArray *) Foo{
    int array[2][[self getWidth]][[self getHeight]];
    int x = 0;
    int y = 0;
    for (int i = 0; i < [self getWidth]; i++) {
        for (int j = 0; i < [self getHeight]; j++) {
            // get th values for current position
            tmp = [NSMutableArray arrayWithArray:[self convertAtPoint:i withYValue:j]];
             x = (int) [tmp objectAtIndex:0];
             y = (int) [tmp objectAtIndex:1];
             array[0][i][j] = x;
             array[1][i][j] = y;
        }
    }

    // How can i put the 3D array into a NSArray?
    NSArray *returnArr = [[NSArray alloc] init];
    return returnArr;
}

【问题讨论】:

  • 如果你使用malloc在堆上分配它,你可以返回一个多维数组。如果您想将其存储在 NSArray 中,您可以将数据展平并将其存储在一维中。您执行此操作的方式取决于您是否需要列优先或行优先排序,但一种方法是index = HEIGHT*WIDTH*z + WIDTH*y + x
  • 注意:您不能像这样将未装箱的ints 存储在NSArray 中。 NSArray 仅包含 Objective-C 对象,因此如果您想将 ints 存储在一个中,您可以将它们包装在 NSNumber 实例中。
  • 即便如此,在我将它们存储为 NSNumbers 之后,是否可以将它们包装成 3 个维度?
  • 也许你最好为你的三维数组创建你自己的包装对象。除此之外,您可以将NSArrays 放入NSArrays,最后将 NSNumber 放入最后一个数组。

标签: ios objective-c c cocoa-touch nsarray


【解决方案1】:

我最终没有使用 NSArray,而是使用 malloc 恢复为 C 数组以分配数组所需的空间。

【讨论】:

  • 当然可以,但是如果你想要 Objective-C 的一些细节(例如内存管理),你可以返回一个 NSDataNSMutableData 保存 C 数组。
猜你喜欢
  • 1970-01-01
  • 2021-09-11
  • 2018-06-26
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 2020-09-07
  • 1970-01-01
相关资源
最近更新 更多