您不能使用 ARC 来管理结构中的对象。您负责手动跟踪其内存管理。不鼓励您以这种方式存储对象。
如果您必须以这种方式跟踪内存,则必须在将对象放入结构时告诉 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 中手动管理内存更可取。