Objective-C类与ARC结构(Objective-C classes in structs

2019-07-29 16:17发布

我试图使带班一个结构中它像:

struct my_struct
{
    NSString *string;
    // more fields
};

令我惊讶的,目的-C ++允许该启用ARC。
它将如何管理字符串?
它可以很容易保持在每项任务,但释放的问题。
它可以添加一个析构函数,在它发行,但是这会使结构不平凡。
它还可以使这种不保留或释放,但这样做应该是有unsafe_unretained。

从我的观察没有使用这个的时候,但我想知道到底发生了什么在这里崩溃。

Answer 1:

见的ARC文档的4.3.5 :

4.3.5。 结构和联合的所有权限定领域

是形成不良的一种程序,如果声明了一个C结构或联合的成员有一个非平凡所有权限定的类型。

理由:所产生的类型将非POD在C ++的观点,但C没有给我们很好的语言工具来管理聚集的寿命,所以它更方便简单地禁止他们。 它仍然是可能的一个void *或__unsafe_unretained对象来管理这一点。

这一限制并不在Objective-C ++应用。 然而,nontrivally拥有合格的类型被视为非POD:在C ++ 11点而言,他们不平凡缺省构造,拷贝构造,移动构造,可复制分配,移动分配,或破坏。 这是C ++的一个定义规则的违规使用类ARC之外的是,ARC下,将有一个非平凡的所有权合格成员。

理由:不像在C,我们可以表达所有的所有权资格作为子对象的(默认)特殊成员为类功能的子操作所需的ARC语义。 这些功能则变得不平凡。 这有不明显的结果是类将有一个不平凡的拷贝构造函数和非平凡的析构函数; 如果这通常不会ARC之外真,则类型的对象将被传递,并在ABI-不相容的方式返回。

如果你通过所有的注意事项阅读,我会强烈建议不要在ObjC这样做++。 我强烈反对在任何情况下广泛使用ObjC ++的。 这是一个桥接语言来帮助纯ObjC和纯C ++相互交谈。 它有很多问题。 与ARC相结合ObjC ++引入了不ObjC,以使其异常安全发生时间和空间性能开销。 定义这类ObjC ++的 - 特定的数据结构使得它很难与非ObjC ++代码和非ARC代码(注意,不能使用此弧外的警告)进行交互。 你有内存管理再担心(因为你已经发现的)大部分的你应该得到什么从ARC免费突然变得坚硬。

建立一个纯ObjC层。 建立一个纯C ++层。 建立一个薄ObjC ++层,以配合两者连接在一起。 不要把ObjC对象的结构,并且绝对不会在任何公共结构(即可见定义它的单ObjC ++对象以外的区域)。



文章来源: Objective-C classes in structs with ARC