我来自Java,我对Objective C很新。无论如何,我有这个静态方法,旨在制作一个数组的副本 (如果有的话)更好的方法来实现这一点,请让我知道,但我更多地问这个问题,以便找出我为什么会遇到这个错误,以及如何在将来避免这样的错误。)我遇到了一些问题有了它,但就在我认为我把它们全部整理好的时候,我得到的这个错误看起来像XCode http://i43.tinypic.com/35nal3n.png
以下是界面中的方法:
+ (float[]) copyArray: (float[]) array withLength: (int) length;
以下是实施中的方法:
+ (float[]) copyArray: (float[]) array withLength: (int) length
{
float copiedArray[length];
for (int i = 0; i < length; i++)
{
copiedArray[i] = array[i];
}
return copiedArray;
}
答案 0 :(得分:6)
如果您真正想要的是将第一个 n 元素从一个C数组复制到另一个已存在的数组中,那么最好的方法就是简单地使用{{1 }}:
memcpy
memcpy(targetArray, sourceArray, sizeof(sourceArray[0]) * numElements);
计算数组中类型的字节大小(在您的情况下,它相当于sizeof(sourceArray[0])
。
答案 1 :(得分:4)
方法/函数不能返回C数组。你应该这样做
+ (void) copyArrayFrom:(float *)array to:(float *)toArray withLength: (unsigned) length
{
for (int i = 0; i < length; i++)
{
toArray [i] = array[i];
}
}
答案 2 :(得分:2)
C数组比Java数组更棘手。其中一个最大的问题是,在很多情况下,除非您将此信息保存在不同的变量中,否则您不知道C数组的大小。 C FAQ "Arrays and Pointers"列出了很多陷阱,它们也适用于Objective-C。您可能希望特别看到问题6.5。
正如@lwxted已经建议的那样,尽量避免使用C数组,除非你真的知道自己在做什么并确定自己需要它们。 C阵列 比NSArray
更快,但除非您确定您的阵列确实是使用分析器测量的性能瓶颈,否则您很可能不会注意到任何差异
我强烈建议避免使用Objective-C对象的C数组(id objects[]
),除非你真的,非常清楚你正在做什么(内存管理问题)。
答案 3 :(得分:1)
在Objective-C中,除非有特殊需要,否则更好的方法是使用NSArray
而不是C数组。
[NSArray arrayWithArray: array];
将复制array
。
此外,在这种情况下,如果您坚持使用C数组,建议使用隐式类型长度float[]
。更好的方法是使用指针来操作数组。
此外,堆栈分配的数组在离开函数后将无效,因为它仅在copyArray
函数的范围内是本地的。如果希望数组在范围之外有效,则应动态分配内存。
答案 4 :(得分:1)
虽然我同意@DarkDust提出的所有要点,但如果您使用的是OpenGL等C API,可能会出现使用NSArray
和NSNumber
与C类型数组的情况float
会对效果产生影响。与往常一样,首先尝试使用更简单的方法,并在决定优化之前仔细测量性能。
在任何情况下,要回答原始问题,这里是如何正确返回C数组的副本:
+ (float *)copyOfCArray:(float *)array withLength:(int)length
{
float *copyOfArray = malloc(length * sizeof(float));
for (int i = 0; i < length; i++) {
copyOfArray[i] = array[i];
}
return copyOfArray;
}
此外,可以说根本不需要制作上述方法。相反,考虑将其编写为C函数:
float *CopyArray(float *array, int length)
{
// Implementation would be the same...
}