objectivec-如何在循环中动态地构建这样的c数组,返回它,并保留引用



现在我有这个设置:

存储两个NSMutableArray实例的NSMutabableArray。

for循环遍历一组数据并将值写入这些数组。这是一个将要用OpenGL ES.显示的大型图表

包含另外两个NSMutableArray对象的NSMutableArray由一个方法返回,调用方将其分配给一个保留属性。

问题是:最多可以有2.000个值,我不喜欢创建所有这些NSNumber对象。

现在我希望有一种轻量级的方法可以用C.实现这一点

在循环之前,我知道数据点的数量。

现在我想重构它,这样我就可以得到只包含普通旧浮点值的轻量级C数组。我知道如何创建浮点值的C数组,但不是真正动态的:

CGFloat values[ ] = {
    0, 2.5f,
    30.2f, 2.5f,
    50.95f, 200.55f,
    930.2f, 122.1f,
};

问题:

1( 如何在循环中动态创建这样的数组?

2( 如何将其中两个数组放入一个数组?

3( 记忆管理怎么样?该方法返回多维C数组,接收器需要将其分配给实例变量(属性(。它需要保留一段时间。我怎么能创建一个实例变量来保存这样一个C数组,而不事先知道它的确切大小?

对于您的第一个问题,您可以使用malloc()动态创建一个数组,并使用指针变量存储对其第一个元素的引用。例如,这将创建一个由8个CGFloats:组成的数组

CGFloat *a = malloc(8 * sizeof a[0]);

如果a为非NULL,则可以按常规方式访问a[0]a[7]。您可以将这个CGFloat *值返回给另一个函数,当您处理完数组后,您必须将这个值传递给free()

对于第二个问题,您可以创建一个由指向两个动态数组的两个指针组成的数组:

CGFloat *a[2] = { NULL, NULL };
a[0] = malloc(8 * sizeof a[0][0]);
a[1] = malloc(16 * sizeof a[1][0]);

现在,您可以访问a[0][0]a[0][7]a[1][0]a[1][15](只要a[0]a[1]不是NULL(。

然而,这里有一个问题:不能直接返回C中的数组,因此不能再从函数返回a可以使用两个级别的动态数组,但首先将指针数组存储在保留对象中,并将对该数组的引用传递给填充它的函数可能更有意义。

这意味着您的包含对象将包括CGFloat *a[2]字段,而分配动态数组并填充它们的函数将包括一个CFloat *dest[]参数。该功能将从以下内容开始:

dest[0] = malloc(8 * sizeof dest[0][0]);
dest[1] = malloc(16 * sizeof dest[1][0]);

然后正常填写这些值。

对于第三个问题,malloc()创建的数组将一直存在,直到该指针稍后传递给free()。如前所述,您可以很高兴地返回该值并将其存储在其他地方,只要您在处理完它之前不free()即可。

这将为您提供一个新的数组:

CGFLoat* myArray = malloc(numberOfFloat * sizeof(float));

你可以做myArray[6] = 0;之类的事情。

完成后,您必须调用free(myArray),否则将发生内存泄漏。

考虑到这一点,您的实例变量将只是一个CGFloat*

相关内容

  • 没有找到相关文章

最新更新