2012-08-24 42 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代碼執行錯誤的操作並繞過內存管理。因此,它必須被禁止。