如果我在頭檔案id中定義一個 Objective-C :struct
struct MyStruct {
id field;
};
struct MyStruct *_Nonnull myFunction(void);
然后我#include將此標頭放入橋接頭中,然后嘗試myFunction()從 Swift 端使用,它將回傳OpaquePointer. 如果我嘗試MyStruct直接回傳,則會出錯說myFunction未定義。這僅在MyStruct包含 Objective-C時發生id。
奇怪的是,如果我宣告一個普通型別的變數id,它可以很好地移植到 Swift。
為什么 Swift 拒絕包含 Objective-C的結構id,我應該怎么做才能避免這種情況?
uj5u.com熱心網友回復:
Swift 無法處理結構中的強參考。它無法插入所需的保留/釋放。
您需要通過標記欄位來告訴 Swift 不必這樣做__unsafe_unretained:
struct MyStruct {
__unsafe_unretained id field;
};
這樣,它將正常匯入,但field會Unmanaged,這意味著您需要根據需要自己處理記憶體管理。
請注意,如果這段代碼也是從 ObjC 呼叫的,那么這也會改變它的記憶體管理。正如執行緒中所討論的,您可能需要檢查__swift__定義以檢查正在編譯此標頭的語言。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/526546.html
標籤:迅速目标-c结构
