我是否正确创建并将此C数组传递给Objective-C方法并使用属性引用它?

我创建了一个像这样的C数组:

unsigned char colorComps[] = {2, 3, 22, 55, 9, 1}; 

我想传递给Objective-C对象的初始化器。

所以我想我必须将数组放在堆上:

 size_t arrayByteSize = numColorCompVals * sizeof(unsigned char); unsigned char *colorCompsHeap = (unsigned char*)malloc(arrayByteSize); 

然后我必须在for循环中将我的第一个“堆栈内存数组”写入堆数组:

 for (int i = 0; i < numColorCompVals; i++) { colorCompsHeap[i] = colorComps[i]; } 

附带问题:是否有更优雅的解决方案来避免循环步骤?

然后我将它传递给方法:

定义为

 - (id)initWithColorCompsC:(unsigned char *)colorCompsHeap; TheObject *obj = [[TheObject alloc] initWithColorCompsC:colorCompsHeap]; 

TheObject具有保存C数组的属性:

 @property (nonatomic, assign) unsigned char *colorComps; 

在-dealloc我释放它:

 free(_colorComps); 

这是理论上的。 我使用ARC作为Objective-C。 我这样做是对还是有更好的方法?

如果TheObject要释放数组,那么它的init方法应该是制作副本的方法,而不是调用方。 这样, TheObject每个实例都会创建自己的副本并释放自己的副本,它拥有该副本。

此外,init的参数来自堆栈或堆的位置也无关紧要。 init方法是否复制了它并不重要。

使用memcpy制作带有目标数组sizeof的副本,如下所示:.m文件:

 @interface PTTEST () @property (nonatomic, assign) unsigned char *colorComps; @end @implementation PTTEST - (void)dealloc { free(_colorComps); } - (id)initWithColorCompsC:(unsigned char *)colorComps numberOfColorComps:(unsigned)numberOfColorComps { self = [super init]; if (self) { // compute size based on sizeof the first element (in case // the element type get changed later, this still works right) size_t arraySize = sizeof(colorComps[0]) * numberOfColorComps; _colorComps = malloc(arraySize); memcpy(_colorComps, colorComps, arraySize); } return self; } @end 

这似乎很好,但是……

  1. 不要malloc()的返回值 ;
  2. 并且不要重新发明memcpy() 。 而不是你的for循环,写memcpy(dest, src, size)

对我来说似乎不正确,你正在使用colorComps[] (一个双精度数组)的值填充colorCompsHeap (一个无符号字符数组)

 unsigned char u = 0.2; printf("%f\n", (double)u); 

输出0.000000