4

我想知道为什么在使用 ARC 时不能在结构中包含对象。每当我这样做时,我都会收到错误消息

ARC 禁止结构中的objective-c 对象

我看到许多讨论解决方案的答案,但没有一个讨论它首先不起作用的根本原因。

4

3 回答 3

4

如果您查看Transitioning to ARC Release Notes,它会说:

您不能在 C 结构中使用对象指针。

您可以创建一个 Objective-C 类来管理数据,而不是使用结构。

如果您观看 WWDC 2011 视频Introducing Automatic Reference Counting ,它会在标题为Rule #2/4: No Object Pointers in C Structs (slide #21)的幻灯片中谈到为什么会出现这种情况,即:

编译器必须知道引用何时来去

  • 指针必须初始化为零

  • 参考消失时释放

C 结构不满足该标准,这就是为什么他们建议使用对象来代替。您可以__unsafe_unretained与 C 结构一起使用,但顾名思义,它很明显、不安全,并且破坏了 ARC 的许多优点。

于 2013-08-26T18:41:22.570 回答
2

通常,struct在编译时不容易推断 a 的生命周期,其结果是,如果在结构中允许所有权限定的引用,那么推理它们所引用的对象的生命周期的能力将非常严重编译时复杂。

clang 文档明确提到了这个并发症。

于 2013-08-26T18:42:42.417 回答
1

C struct 没有析构函数语义。ARC 不知道何时释放此类结构中的对象字段。对称地,没有复制构造函数——结构赋值只是按位复制,因此 ARC 既不能保留对象字段。

于 2013-08-26T18:42:08.217 回答