我是不是正确地创建了这个 C 数组并将其传递给 Objective-C 方法并使用属性引用它?
Posted
技术标签:
【中文标题】我是不是正确地创建了这个 C 数组并将其传递给 Objective-C 方法并使用属性引用它?【英文标题】:Am I correctly creating and passing this C array to Objective-C method and referencing it with a property?我是否正确地创建了这个 C 数组并将其传递给 Objective-C 方法并使用属性引用它? 【发布时间】:2013-08-08 22:50:18 【问题描述】:我创建了一个这样的 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];
附带问题:有没有更优雅的解决方案来避免 for 循环步骤?
然后我将它传递给方法:
定义为
- (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。 我这样做是正确的还是有更好的方法?
【问题讨论】:
在构造函数中分配和复制数组可能会更好。 【参考方案1】:这看起来不错,但是...
-
Don't cast the return value of
malloc()
;
不要重新发明memcpy()
。而不是你的for循环,写memcpy(dest, src, size)
。
【讨论】:
甚至更好 - 将memcpy
与 C99 复合文字数组一起使用。更简洁。
@RichardJ.RossIII 是的,I am aware of them(我只是不认为这是这里的问题。)
Richard 你能解释一下你对 C99 复合文字数组的意思吗?
根据文档 memcpy 用于字符。其他数据类型呢? tutorialspoint.com/c_standard_library/c_function_memcpy.htm
@ProudMember:memcpy
复制数据。它对数据类型并不挑剔。您链接到的文档明确指定它采用 void *
参数,而不是 char
或 char *
。【参考方案2】:
如果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
【讨论】:
还有一个问题:为什么 size_t arraySize = sizeof(colorComps) 不起作用? @ProudMember 因为它返回指针的大小,而不是数组本身。 那么 sizeof(&colorComps) 怎么样? @H2CO3 需要解释一下吗? @ProudMember 解释什么?【参考方案3】:对我来说似乎不正确,您正在用 colorComps[]
(双精度数组)的值填充 colorCompsHeap
(无符号字符数组)
unsigned char u = 0.2;
printf("%f\n", (double)u);
输出0.000000
【讨论】:
@DavidRF 然后是别人,他还是没有留下任何解释。以上是关于我是不是正确地创建了这个 C 数组并将其传递给 Objective-C 方法并使用属性引用它?的主要内容,如果未能解决你的问题,请参考以下文章