簡體   English   中英

使用ARC的結構中的Objective-C類

[英]Objective-C classes in structs with ARC

我嘗試在其中創建一個包含類的結構,如:

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

令我驚訝的是,Objective-C ++允許啟用ARC。
它將如何管理字符串?
它可以很容易地保留在每個任務中,但釋放是問題所在。
它可以添加一個帶有釋放的析構函數,但這會使結構變得非常簡單。
它也可以使這不保留或釋放,但這樣做應該是unsafe_unretained。

根據我的觀察,使用它時沒有任何事情會崩潰,但我想知道這里到底發生了什么。

請參閱ARC文檔的4.3.5

4.3.5。 結構和工會的所有權合格領域

如果程序聲明C結構或聯合的成員具有非平凡的所有權限定類型,則該程序是不正確的。

基本原理:結果類型在C ++意義上是非POD,但是C不能為我們提供非常好的語言工具來管理聚合的生命周期,所以簡單地禁止它們就更方便了。 仍然可以使用void *或__unsafe_unretained對象來管理它。

此限制不適用於Objective-C ++。 但是,非重要的所有權限定類型被認為是非POD:在C ++ 11術語中,它們不是簡單的默認可構造,可復制構造,移動可構造,可復制可分配,可移動可分配或可破壞。 使用ARC之外的類是違反C ++的一個定義規則的,在ARC下,它將擁有一個非常重要的所有權限成員。

基本原理:與C不同,我們可以將所有權限的子對象的所有必要ARC語義表示為類的(默認)特殊成員函數的子操作。 這些功能變得非常重要。 這具有非顯而易見的結果,該類將具有非平凡的復制構造函數和非平凡的析構函數; 如果在ARC之外通常不存在這種情況,則該類型的對象將以ABI不兼容的方式傳遞和返回。

如果你仔細閱讀所有注意事項,我強烈建議不要在ObjC ++中這樣做。 我強烈建議不要在任何情況下廣泛使用ObjC ++。 它是一種橋接語言,可以幫助純粹的ObjC和純C ++相互通信。 它有很多問題。 將ObjC ++與ARC結合使用會引入時間和空間性能成本,這些成本在ObjC中不會發生,以使其異常安全。 定義這些特定於ObjC ++的數據結構使得很難與非ObjC ++代碼和非ARC代碼進行交互(請注意,您不能在ARC之外使用它)。 你應該從ARC免費獲得的大部分內容突然變得困難,因為你必須再次擔心內存管理(正如你已經發現的那樣)。

構建一個純ObjC層。 構建純C ++層。 構建一個瘦的ObjC ++層將兩者結合在一起。 不要將ObjC對象放在結構中,並且絕對不要放在任何公共結構中(即在定義它的單個ObjC ++對象之外可見)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM