我有一个名为ItemComponent的自定义类。另一个类有一个名为subComponents的数组。这是班级的财产:
ItemComponent *subComponents[0];
最初,它设置为0,因为并非所有对象都有子组件。
在实现中,我有一个方法将ItemComponent添加到属性中。该项目被传入,并且分配编码如下(在必要的检查和切换之后):
ItemComponent *tempArray[1];
tempArray[0] = item;
subComponents = tempArray;
我在最后一行收到错误:“分配中的不兼容类型”。
它们都是指向数组的指针,所以它给出了什么?
谢谢!
答案 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数组。