我尝试在其中创建一个包含类的结构,如:
struct my_struct
{
NSString *string;
// more fields
};
令我惊讶的是,Objective-C ++允许启用ARC
它将如何管理字符串?
它可以很容易地保留在每个任务中,但释放是问题
它可以添加一个带释放的析构函数,但这会使结构变得非常简单
它也可以使这不保留或释放,但这样做应该是unsafe_unretained。
根据我的观察,使用它时没有任何事情发生崩溃,但我想知道这里到底发生了什么。
答案 0 :(得分:9)
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 ++对象外部可见)。