将ID存储在C数组中

时间:2014-07-04 18:21:18

标签: ios objective-c arrays

我想创建一个C数组,它存储一些对象,但是想声明如下:

id array = malloc(sizeof(NSObject * 4));

但这会产生错误;它要求我:

  

修复它 - 使用__bridge直接转换(所有权没有变化)。

或者:

  

修复它:使用CFBridgeRelease呼叫转移+1的所有权   '空隙'进入ARC。

我已尝试过两者,但仍然出错:

  

失踪)

我记得这样做过;但我忘记了,因为它已经有一段时间了。

如何将id存储在C数组中并从中检索出来然后将其丢弃?

2 个答案:

答案 0 :(得分:2)

所有类型(包括对象)的指针大小都相同,因此您只需要以下内容:

id *myArray = malloc(sizeof(void *) * 4);

请注意,发布示例中左侧使用的类型也不正确,因为要分配的内存应该被引用为指向对象的C指针数组,而不仅仅是对象。

如果您在启用ARC的情况下进行编译,则需要在myArray声明中添加生命周期限定符,并转换malloc的返回值。这是因为ARC只能管理指向对象的指针的生命周期,而你要存储对象的数组是C类型。例如,要明确告诉ARC数组中的指针是不受管理的,您可以按如下方式修改前面的代码:

    __unsafe_unretained id *myArray = (__unsafe_unretained id *) malloc(sizeof(void *) * 4);

请注意,由于ARC无法管理C数组中的保留计数,因此您可以确保可以安全地使用存储在数组中的任何内容。

答案 1 :(得分:-1)

您无法在Objective-C中存储对象数组。它只允许分配指向对象的指针。要做到这一点,正确的语法将是这样的:

id *array = malloc(sizeof(*array) * 4);

或可能

id *array = malloc(sizeof(id) * 4);

但前者更干。