我需要在void *指针的C结构中保留Objective C对象。此结构在外部库中定义,我无法更改定义。
让我们说它被定义为:
struct c_context {
void* user_data;
};
我在代码中需要做的是:
struct c_context *context;
...
context->user_data = [[MYObjCClass alloc] init];
但是,我需要确保保留MYObjCClass
对象。
所以我的问题是:
void*
告诉编译器保留obj-c对象?答案 0 :(得分:12)
You cannot use ARC to manage an object in a struct.您负责手动跟踪其内存管理。不鼓励你以这种方式存储对象。
如果必须以这种方式跟踪内存,则必须告诉ARC,当您将对象放入结构中时,您将对该对象负责:
context->user_data = CFBridgingRetain([[MYObjCClass alloc] init]);
这告诉ARC它不再对init
返回的对象负责,并添加了手册retain
,以便context->user_data
现在是所有者。
完成对象后,您可以将其传回ARC,也可以将其释放。把它转回ARC:
MYObjCClass *something = CFBridgingRelease(context->user_data);
context->user_data = NULL;
这告诉ARC它负责对象并删除你的保留。您应该使指针为NULL,因为context->user_data
不再拥有此对象,并且该对象可能随时消失。
您也可以直接发布它:
CFRelease(context->user_data);
context->user_data = NULL;
同样,这是最后的手段。通常,您不应将ObjC对象存储在结构中,因为ARC无法管理它们。
作为旁注,虽然我一般不推荐使用ObjC ++,但可以使用带有析构函数的C ++结构来自动执行此操作。在某些情况下,这可能比C中的手动内存管理更可取。