Objective C在类初始化时分配原始c数组实例变量

时间:2012-03-28 17:45:45

标签: objective-c c initialization dynamic-arrays

我正在尝试编写一个绘制OpenGL多边形的Objective C类。我已经设法使用NSMutableArray来存储我的顶点坐标。然而,这似乎有点低效,因为每次绘制一个对象时,都需要循环遍历数组以将NSMutableArray转换为ccVertex2F []数组。

我想要做的是将ccVertex2F数组作为实例变量。然后在初始化时将大小设置为点数。但是这会引发错误,因为我的数组的大小始终为零。

我在Java编程方面经验丰富,但对C和内存管理却全新。到目前为止,这就是我所拥有的:

@interface PolygonNode : CCNode {
    ccVertex2F *  _glPoints ;
}

@property (nonatomic, readwrite) ccVertex2F * glPoints ;
@end

我对此的理解是我正在创建一个实例变量,它是一个指向ccVertex2F的指针。

在我的init方法中,我有以下内容:

    ccVertex2F sizedGlPoints [numberOfPoints * sizeof(ccVertex2F)];
    _glPoints = &sizedGlPoints;

这样做的目的是使实例变量指向我新的正确大小的数组。但是,当我在此代码后打印尺寸_glPoints大小不会改变。

我想要做的核心是在初始化类时能够选择数组的大小,这样我就不会浪费内存。

2 个答案:

答案 0 :(得分:2)

您可以使用malloc为数组分配内存:

ccVertext2F *newMemory = malloc(numberOfPoints * sizeof(ccVertex2F));
if (newMemory == NULL) {
    // Handle error
}
_glPoints = newMemory;

请记住在完成后(-dealloc或再次分配之前)释放它:

free(_glPoints);

答案 1 :(得分:0)

如果您尝试使用纯C进行分配,则使用malloc或calloc进行分配,并可以自由解除分配。

所以

ccVertex2F sizedGlPoints [numberOfPoints * sizeof(ccVertex2F)];   
_glPoints = &sizedGlPoints;

会变成

_glPoints = (ccVertex2F *) calloc( numberOfPoints, sizeof( ccVertex2F );

如果ccVertex2F是ObjectiveC类,则使用

[ ccVertex2F alloc ] 

进行分配。