2012-08-24 43 views
3

编译的Objective-C++,我得到以下诊断:C++类“不能ARC和非ARC代码之间共享......”

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

类似的错误来弥补丢失的拷贝构造函数和析构函数。添加必要的方法非常简单,但通常它们没有意义,特别是对于我想使其不可复制的类,并且我不会混合使用ARC和非ARC代码(至少不是有意的)。

为什么我得到这个消息,我可以摆脱它,而无需编写毫无意义的成员函数我所有的C++类?

回答

3

这是因为在ARC结构POD并且由于这样的事实,其列入使得管理其存储器暧昧C++类阻碍Objective-C的对象。您可以通过在前面Objective-C的成员与__unsafe_unretained预选赛中,它告诉ARC解决它,保持它的粘性十指关的类,但使您不必管理成员的内存对象自己的尴尬境地。此外,内部链接的对象不包含在警告下,因此将您的类或结构包装在不合格的namespace { }中也适用。如果你绝对必须在正好具有Objective-C对象作为类成员的文件(或文件)中使用ARC,则必须提供适当的访问操作符(如警告所述),否则请关闭ARC并为自己节省麻烦。

+0

不正确。 ARC不允许* C structs *中的Objective-C对象。但是,它们被允许在* C++结构体和类*中。 – newacct

+0

@newacct在[苹果公司的非荚文件]测试(http://www.opensource.apple.com/source/clang/clang-318.0.45/src/tools/clang/test/SemaObjCXX/arc-non-pod .mm)乞求不同。他们明确提到C++结构和类,并提供应该出现的 – CodaFi

+0

你说必要的警告“ARC禁止在结构和C++类的Objective-C对象”,这是错误的。非POD结构和类肯定可以包含没有警告的Objective-C对象。 – newacct

1

的限制是this section of the ARC specification提到:

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

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

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