C型2D阵列为ivar

时间:2015-06-15 02:35:04

标签: ios objective-c arrays

在C中,我们可以执行以下操作来创建2D数组:

int intArray[10][10];

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

size_t col = 10;
size_t row = 10;

int array[row][col];

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

id genObjectArray[10][10];

是否可以在Objective-C中创建一个2d数组?

以下是我的尝试:

@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中,我可以执行以下操作,稍后在块范围内为2D数组分配空间:

int **array;
int *elements;

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

id **array;
id *elements;

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

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

1 个答案:

答案 0 :(得分:1)

你不能这样做。对于C99 VLA,数组所需的空间在声明数组时分配。对于ivar,类似的时间是在分配和初始化对象时,但是在Objective C中没有支持这样做。您需要对对象构造函数可以做什么有更强的定义(更像是Java的构造函数而不是Objective C&#39的初始化函数)。

你能得到的最接近的是:

@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在所有可能的方面都更好。