我是不是正确地创建了这个 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 * 参数,而不是 charchar *【参考方案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 方法并使用属性引用它?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地将 C 数组传递给 C#?

将数据从C#传入和传出DLL

pybind11 返回 numpy 对象数组

如何创建对象的新实例并将其传递到数组 SwiftUI

如何正确传递带有指向函数的指针的数组?

C在函数中传递二维数组会给我分段错误