Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我将C数组传递给Objective-C方法时,让该方法将数组复制到堆内存是否足够?_Objective C_C - Fatal编程技术网

当我将C数组传递给Objective-C方法时,让该方法将数组复制到堆内存是否足够?

当我将C数组传递给Objective-C方法时,让该方法将数组复制到堆内存是否足够?,objective-c,c,Objective C,C,例如: unsigned char colorComps[] = {2, 3, 22, 55, 9, 1}; 将其传递给Objective-C方法,该方法使用属性引用它。首先需要将其复制到堆内存。但是,为了安全起见,让该方法执行此步骤可以吗?还是必须在将其传递给该方法之前将其复制到堆中?与将数组传递给C函数的规则完全相同。Objective-C中没有关于C数组的特殊处理。除了不能用C数组类型声明属性之外。有关解决方法,请参见和。在这种情况下,您的对象(想要公开数组)应该分配内存,复制数组,

例如:

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

将其传递给Objective-C方法,该方法使用属性引用它。首先需要将其复制到堆内存。但是,为了安全起见,让该方法执行此步骤可以吗?还是必须在将其传递给该方法之前将其复制到堆中?

与将数组传递给C函数的规则完全相同。Objective-C中没有关于C数组的特殊处理。除了不能用C数组类型声明属性之外。有关解决方法,请参见和。在这种情况下,您的对象(想要公开数组)应该分配内存,复制数组,并在适当的时候释放它。在“外部”分配它,然后在“内部”释放它是个坏主意

除非你真的需要一个C数组(例如,因为你有一个第三方库想要它作为参数,你需要一直构造它),你应该坚持使用Objective-C对象(NSArray中的NSNumber)。尤其是因为语法现在非常直截了当:

NSArray *myArray = @[ @(1), @(42), @(543) ];

使用C阵列只是“因为它们更快”将是一种未成熟的优化,除非您实际测量到NSArray/NSNumber解决方案对您来说是一个瓶颈。我在iOS上进行多媒体处理,从没有因为性能原因而不得不从NSArray切换到C阵列。

在我使用的几乎所有C API中,约定是调用的函数负责在需要时复制数据

这是有意义的,因为被调用函数知道数据需要多长时间,而调用方不知道。由于出于性能原因,我们通常使用C,这也避免了不必要的内存分配和复制


请注意,除非您有使用C数组的性能原因,否则只需使用NSNumbers的NSArray即可。更简单。

我相信你是在问你之前的问题,所以让我解释一下

如果你只是简单地接受你收到的任何数组并保持它的原样,你就无法控制它;您将代码的完整性完全留给调用函数。您可能会意外地忘记传入副本,或者传入字符串literal*,这样您就有了一个潜在的难以找到的bug。通过使用属性并将ivar设置为您创建的数组,您可以控制它。您确切地知道它的期望寿命,并且您知道在
dealoc
中释放它是安全的(确实是必需的)

请注意,这就是为什么始终应声明块特性
copy
。如果您只是在接收块时将其保留,那么它将无效,并在以后导致问题,除非它在某个时候已经被复制到堆中。但是,当您将块传递给函数时,通常不会复制块,您调用的函数负责确保块可以安全地保留


*:是的,不太可能是您使用它的方式,但在不同的情况下,这可能是一个问题。

他正在传递一个数组,希望将该数组指定给对象属性。如果数组是在堆栈上创建的,那么是的,它将需要复制到堆中,否则一旦弹出包含数组数据的堆栈帧,指针将无效。对,我错过了属性部分。已经更新了问题。好的,看来将数组(在堆栈上)传递给一个方法是安全的,然后该方法将其复制到堆中,以便使用ivar或属性保存对它的引用?@ProudMember完全正确。这与?@ProudMember,H2CO3是正确的,问题是相关的。所以,如果你真的告诉自己想要实现的高层次目标,这会有所帮助。也许你们想用的方式是不必要的复杂,甚至是错误的。@H2CO3看起来像是在问我对那个问题的看法。