gpt4 book ai didi

objective-c - 使用 ARC 在 void* 指针中分配 Objective-C 对象

转载 作者:太空狗 更新时间:2023-10-30 03:28:43 24 4
gpt4 key购买 nike

我需要在 void* 指针的 C 结构中保留一个 Objective C 对象。此结构在外部库中定义,我无法更改定义。

假设它被定义为:

struct c_context {
void* user_data;
};

我需要在我的代码中做的是:

struct c_context *context;
...
context->user_data = [[MYObjCClass alloc] init];

但是,我需要确保 MYObjCClass 对象将被保留。

所以我的问题是:

  1. 如何将其转换(或桥接)为 void* 告诉编译器保留 obj-c 对象?
  2. 稍后需要清理数据时如何释放对象?

最佳答案

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 中手动进行内存管理更可取。

关于objective-c - 使用 ARC 在 void* 指针中分配 Objective-C 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18234651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com