现在我有这个设置:
存储两个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个CGFloat
s:组成的数组
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*
。