C ++类“不能在ARC和非ARC代码之间共享......”

时间:2012-08-24 08:43:58

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

编译Objective-C ++,我得到以下诊断:

'MyClass' cannot be shared between ARC and non-ARC code; add a non-trivial copy assignment operator to make it ABI-compatible

缺少复制构造函数和析构函数会出现类似的错误。添加必要的方法很容易,但通常它们没有意义,特别是对于我想要不可复制的类,我不混合ARC和非ARC代码(至少不是故意的)。 / p>

为什么我收到此消息,如果不为所有C ++类编写无意义的成员函数,我可以摆脱它吗?

2 个答案:

答案 0 :(得分:3)

这是因为ARC阻止了POD结构和C ++类中的Objective-C对象,因为它们的包含使得管理内存变得模糊不清。你可以通过在Objective-C成员前面添加__unsafe_unretained限定符来解决它,它告诉ARC保持它在课堂上的粘性,但让你处于必须自己管理成员对象内存的尴尬境地。此外,具有内部链接的对象不在警告范围内,因此将您的类或结构包装在不合格的namespace { }中也是如此。如果您绝对必须在恰好将Objective-C Objects作为类成员的文件(或多个文件)中使用ARC,则必须提供正确的访问操作符(如警告所示),否则只需关闭ARC并省去麻烦。

答案 1 :(得分:1)

this section of the ARC specification中提到了限制:

  

但是,非重要的所有权限定类型被视为非POD:   在C ++ 11术语中,它们并非简单的默认构造,复制   可构造的,移动的可构造的,可复制的,可移动的,可分配的,   或可破坏的。它违反了C ++的One Definition Rule   ARC之外的一个类,在ARC下,会有一个非常重要的   所有权合格的成员。

原因是:在ARC中,当您使用Objective-C对象作为C ++结构或类的字段时,ARC会隐式地将代码添加到默认构造函数,复制构造函数,析构函数等以管理字段的内存。如果结构或类没有这些构造函数/析构函数,ARC会自动添加它们。

这意味着如果这样的结构或类最初被认为是“POD”(C ++术语意味着它没有特殊的构造函数/析构函数),ARC通过隐式添加这些特殊构造函数/析构函数使其成为非POD。但是,C ++在某些地方对待POD和非POD类型的方式不同。如果从非ARC和ARC代码中看到这样的原始POD结构或类声明,则非ARC代码可能认为它仍然是POD类型。但这是错误的(ARC添加了使其成为非POD的方法),并且将允许非ARC代码执行错误操作并绕过内存管理。因此,必须禁止它。