我有一些UIView
or UITableViewCell
。里面我有 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())
}
In C:
void CCalback(void * classPtr, void(*callback)(void *, MyData)){
//fill data
callback(classPtr, data)
}
我应该使用takeUnretainedValue
or takeRetainedValue
关闭?据我了解,retained会增加对象引用计数,所以它不会被自动销毁?否则,如果我使用takeUnretainedValue
,如果 self 是自动释放的,这会崩溃,所以使用takeRetainedValue
会阻止它。我对么?
对象指针可以转换为Unsafe(Mutable)RawPointer
(斯威夫特
相当于Cvoid *
)保留或不保留对象:
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
is 保证当回调处于活动状态时
那么最简单的方法是在两个方向上使用“未保留”的转换。您有责任保留obj
而
回调处于活动状态,例如通过之前取消注册回调obj
被取消初始化。
另一种方法是使用passRetained()
转换obj
到
一个指针。这会保留该对象并因此使其保持“活力”。
回调仍然可以使用“未保留”转换来转换
指向对象指针的指针,而不减少保留计数。
但一定有一个takeRetainedValue()
调用以消耗
保持。之后,如果没有任何对象,则可以销毁该对象
其他对其的引用。
更一般地说,每次调用passRetained(obj)
增加保留
计数并每次调用takeRetainedValue()
减少它,所以它们必须适当平衡。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)