为什么id不能通过struct从Objective-C移植到Swift



如果我在头文件中的struct中定义Objective-Cid

struct MyStruct {
id field;
};
struct MyStruct *_Nonnull myFunction(void);

然后我将#include这个头放入桥接头中,然后尝试使用Swift侧的myFunction(),它将返回OpaquePointer。如果我尝试直接返回MyStruct,它会错误地说myFunction没有定义。只有当MyStruct包含Objective-Cid时才会发生这种情况。

奇怪的是,如果我声明一个类型为id的普通变量,它可以很好地移植到Swift。

Swift为什么拒绝包含Objective-Cids的structs?我应该怎么做才能避免这种情况?

Swift不能处理结构中的强引用。它无法插入所需的保留/释放。

您需要通过标记字段__unsafe_unretained:来告诉Swift它不必这样做

struct MyStruct {
__unsafe_unretained id field;
};

这样,它将正常导入,但field将是Unmanaged,这意味着您需要根据需要自己处理内存管理。

注意,如果这个代码也是从ObjC调用的,那么这也会改变它在那里的内存管理。正如线程中所讨论的,您可能需要检查__swift__定义,以检查编译此标头的语言。

最新更新