gpt4 book ai didi

ios - Swift C 回调 - takeUnretainedValue 或 takeRetainedValue 用于 Swift 类指针

转载 作者:可可西里 更新时间:2023-11-01 01:19:09 25 4
gpt4 key购买 nike

我有几个 UIViewUITableViewCell。里面我有 C 回调,例如:

CCallback(bridge(self),
{(observer, data) -> Void in
let mySelf = Unmanaged<DetailedView>.fromOpaque(observer!).takeRetainedValue()
mySelf.fillLoadedData(data: data)
});

别处

func bridge<T : AnyObject>(_ obj : T) -> UnsafeMutableRawPointer {
return UnsafeMutableRawPointer(Unmanaged.passUnretained(obj).toOpaque())
}

在 C 中:

void CCalback(void * classPtr, void(*callback)(void *, MyData)){
//fill data
callback(classPtr, data)
}

我应该在闭包中使用takeUnretainedValue 还是takeRetainedValue?据我了解,保留会增加对象引用计数,因此不会自动销毁?否则,如果我使用 takeUnretainedValue,如果 self 被自动释放,这会崩溃,所以使用 takeRetainedValue 会阻止它。我对么?

最佳答案

对象指针可以转换为 Unsafe(Mutable)RawPointer(Swift等同于 C void *) 保留或不保留对象:

let ptr = UnsafeMutableRawPointer(Unmanaged.passUnretained(obj).toOpaque())
// Does not retain `obj`

let ptr = UnsafeMutableRawPointer(Unmanaged.passRetained(obj).toOpaque())
// Retains `obj`

转换回对象指针(通常在回调中完成从 C) 调用的函数可以使用或不使用保留:​​

let obj = Unmanaged<T>.fromOpaque(ptr).takeUnretainedValue()
// Does not consume a retain

let obj = Unmanaged<T>.fromOpaque(ptr).takeRetainedValue()
// Consumes a retain

如果 obj 的生命周期是 guaranteed 而回调是活跃的那么最简单的方法是在两个方向上使用“未保留”转换。您有责任保留 obj 而回调处于事件状态,例如通过在 obj 之前注销回调被取消初始化。

另一种方法是使用 passRetained()obj 转换为一个指针。这保留了对象,因此使它保持“活着”。回调仍然可以使用“未保留”转换来转换指向对象指针的指针,而不减少保留计数。但是必须有一个 takeRetainedValue() 调用来消耗保持。之后,如果没有对象可以销毁对它的其他引用。

更一般地,每次调用 passRetained(obj) 都会增加保留count 并且每次调用 takeRetainedValue() 都会减少它,因此它们必须适本地平衡。

关于ios - Swift C 回调 - takeUnretainedValue 或 takeRetainedValue 用于 Swift 类指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44720121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com