使用ARC的结构中的Objective-C类

时间:2012-06-01 14:11:13

标签: objective-c struct automatic-ref-counting objective-c++

我尝试在其中创建一个包含类的结构,如:

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

令我惊讶的是,Objective-C ++允许启用ARC 它将如何管理字符串?
它可以很容易地保留在每个任务中,但释放是问题 它可以添加一个带释放的析构函数,但这会使结构变得非常简单 它也可以使这不保留或释放,但这样做应该是unsafe_unretained。

根据我的观察,使用它时没有任何事情发生崩溃,但我想知道这里到底发生了什么。

1 个答案:

答案 0 :(得分:9)

请参阅4.3.5 of the ARC docs

  

4.3.5。结构和工会的所有权合格领域

     

如果程序声明了C结构或联合的成员,则该程序格式错误   拥有一个非常重要的所有权限制类型。

     

基本原理:结果类型在C ++意义上是非POD,但是C.   没有给我们很好的语言工具来管理它的生命周期   聚合,所以简单地禁止它们更方便。它是   仍然可以使用void *或__unsafe_unretained来管理它   对象

     

此限制不适用于Objective-C ++。然而,非常重要   所有权限定类型被认为是非POD:在C ++ 11术语中,它们   不是简单的默认可构造,复制可构造,移动   可构造的,可复制的,可移动的可分配的或可破坏的。它   是违反C ++的一个定义规则来使用外面的类   在ARC下,ARC将具有非常重要的所有权限制   构件。

     

理由:与C不同,我们可以表达所有必要的ARC语义   对于所有权限定的子对象作为(默认)的子操作   该类的特殊成员函数。这些功能就变成了   不平凡的。这具有班级将具有的非显而易见的结果   一个非平凡的复制构造函数和非平凡的析构函数;如果这   在ARC之外通常不会是真的,类型的对象将是   以ABI不兼容的方式传递和返回。

如果你仔细阅读了所有注意事项,我强烈建议不要在ObjC ++中这样做。我强烈建议不要在任何情况下广泛使用ObjC ++。它是一种桥接语言,可以帮助纯粹的ObjC和纯C ++相互通信。它有很多问题。将ObjC ++与ARC结合使用会引入时间和空间性能成本,这些成本在ObjC中不会发生,以使其异常安全。定义这些特定于ObjC ++的数据结构使得很难与非ObjC ++代码和非ARC代码进行交互(请注意,您不能在ARC之外使用它)。你应该从ARC免费获得的大部分内容突然变得困难,因为你必须再次担心内存管理(正如你已经发现的那样)。

构建纯粹的ObjC图层。构建纯C ++层。构建一个瘦的ObjC ++层将两者结合在一起。不要将ObjC对象放在结构体中,绝对不要放在任何公共结构中(即在定义它的单个ObjC ++对象外部可见)。