ios - C 风格二维数组作为 ivar

标签 ios objective-c arrays

在 C 中,我们可以执行以下操作来创建一个二维数组:

int intArray[10][10];

在 C99 中,我们可以创建一个 VLA:

size_t col = 10;
size_t row = 10;

int array[row][col];

在 Objective-C 的一个方法中,我可以创建一个包含 id 的二维数组,如下所示:

id genObjectArray[10][10];

是否可以在 Objective-C 中创建二维数组 ivar?

以下是我尝试过的:

@interface myClass ()
{
    id objArray[][]; 
    //This doesn't work, unless I specific size.
    //I want to do this, so that I could specific the size later during 
    //runtime
}

在 C 中,我可以执行以下操作并稍后在 block 范围内为二维数组分配空间:

int **array;
int *elements;

我也可以在 Objective-C 中做同样的事情,但是当我使用 id 或其他对象类型时就会出现问题;换句话说,以下内容无效:

id **array;
id *elements;

因此,我的问题是,是否可以将 C 风格的二维数组声明为包含 id 的 ivar?

我知道我们可以使用普通的 NS(Mutable)Array 来实现它;但这仅用于教育目的。

最佳答案

你不能这样做。对于 C99 VLA,数组所需的空间在声明数组时分配。对于 ivar,类似的时间是对象被分配和初始化时,但 Objective C 不支持这样做。您需要对对象构造函数的功能有更明确的定义(更像是 Java 的构造函数而不是 Objective C 的初始化程序)。

你能得到的最接近的是这样的:

@interface myClass () {
    id * objArray;
}

-(instancetype)initWithRow:(size_t)row col:(size_t)col {
    self = [super init];
    if (self) {
        objArray = calloc(row * col * sizeof(id));
    }
    return self;
}

-(void)dealloc {
    free(objArray);
}

在这种情况下,您将 ivar 声明为指针并自行管理存储(以及跨度,对于多维数组)。

显然,NSArray 在所有可能的方面都更好。

关于ios - C 风格二维数组作为 ivar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30836634/

相关文章:

iPhone - 如何在进入前景后恢复帧大小?

javascript - 如何将另一个网页中的表格加载到数组中?

javascript - 学习 While 循环。无法弄清楚我的代码中缺少什么。

c - 在C中将字符串拆分为数组

UIAlertView 自定义中的 iOS 7 UIDatePicker

ios - 解析 Koloda 库上的数据 - 无法在 View 中显示

ios - UIView/UIViewController 右上角的页面 curl

iphone - 在 iOS 中组合图像时像素损坏

ios - 在 iOS 中处理后台任务的正确方法是什么

ios - 在方法内部或调用该方法时使用 dispatch_async()