分配数组引用,不兼容的类型?

时间:2009-09-08 03:38:40

标签: iphone objective-c

我有一个名为ItemComponent的自定义类。另一个类有一个名为subComponents的数组。这是班级的财产:

ItemComponent *subComponents[0];

最初,它设置为0,因为并非所有对象都有子组件。

在实现中,我有一个方法将ItemComponent添加到属性中。该项目被传入,并且分配编码如下(在必要的检查和切换之后):

ItemComponent *tempArray[1];
tempArray[0] = item;
subComponents = tempArray;

我在最后一行收到错误:“分配中的不兼容类型”。

它们都是指向数组的指针,所以它给出了什么?

谢谢!

3 个答案:

答案 0 :(得分:2)

首先,正如我在评论中所写的那样,我认为你出汗太多了。我想我们正在谈论一些游戏对象可以包含一些组件。在这种情况下,将组件保持在NSArray是完全可以负担​​得起的。代码将更容易使用,速度差异很小。

如果你想安心入睡,可以设置一个小的测试,它会迭代几千NSMutableArrays次,甚至可能会更改其中的一些。然后测量所需的时间:

double start = CFAbsoluteTimeGetCurrent();
// now iterate over the arrays, send some messages, change contents
double end = CFAbsoluteTimeGetCurrent();
double diff = end-start; // in seconds
NSAssert(diff < 0.005, @"I’ll be damned.");

(0.005部分可能太陡了,取决于你想要做什么,但我想你明白了.50fps≈1/ 50 s = 0.02 s = 20 ms,整个框架要建造。如果整个Objective-C开销需要10毫秒,其余时间你还有大约20毫秒,保持30 fps的体面帧速率。)

在某些情况下,您可能希望使用普通C数组,例如,当您编写粒子引擎并且数组中有数千个项目会更改每个循环时。在这种情况下,您只需使用指针:

ItemComponent *components;
int compMax;
// …
compMax = 1000;
components = calloc(compMax, sizeof(ItemComponent));
NSAssert(components != NULL, @"Out of memory for components.");
components[0] = …;
components[1] = …;
// …
free(components);

我百分百肯定第一点。我对第二种情况不是很确定,也许有更安全的方法,但我会这样写。

答案 1 :(得分:0)

你有没有理由使用C数组而不是NSMutableArrays?

答案 2 :(得分:0)

试试这个是否有所作为。

ItemComponent *subComponents[];

您定义它的方式,subComponents数组实际上将其(零)项存储在您的其他类变量中。您无法将其重置为指向其他位置。为了做到这一点,你需要使它成为指向ItemComponent的指针,而不是一个零长度的ItemComponents数组。