我想创建一个C数组,它存储一些对象,但是想声明如下:
id array = malloc(sizeof(NSObject * 4));
但这会产生错误;它要求我:
修复它 - 使用__bridge直接转换(所有权没有变化)。
或者:
修复它:使用CFBridgeRelease呼叫转移+1的所有权 '空隙'进入ARC。
我已尝试过两者,但仍然出错:
失踪)
我记得这样做过;但我忘记了,因为它已经有一段时间了。
如何将id
存储在C数组中并从中检索出来然后将其丢弃?
答案 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);
但前者更干。