【发布时间】:2017-01-20 22:26:09
【问题描述】:
我在 Swift 中使用指针进行了一些测试,并想验证我使用指针的对象没有被保留。
func test1(){
let str = aaa();
print(CFGetRetainCount(str))
let ptr1 = Unmanaged.passUnretained(str).toOpaque()
print(CFGetRetainCount(str))
let str2 = Unmanaged<aaa>.fromOpaque(ptr1).takeUnretainedValue();
print(CFGetRetainCount(str2))
}
结果是 2,2,3。所以“passUnretained”没有保留,但“takeUnretainedValue”有。
更改为“takeRetainedValue”可解决问题,并导致预期的崩溃。输出 2,2,2。
func test1(){
let str = aaa();
print(CFGetRetainCount(str))
let ptr1 = Unmanaged.passUnretained(str).toOpaque()
print(CFGetRetainCount(str))
let str2 = Unmanaged<aaa>.fromOpaque(ptr1).takeRetainedValue();
print(CFGetRetainCount(str2))
}
因此,总而言之,“takeRetainedValue”不会保留该值。
更新:我已编辑此问题以删除一些以前令人困惑的陈述并将其返回到基本编程问题。
【问题讨论】:
-
是的。我弄清楚了最初的问题。 “passUnretained”不保留,但“takeUnretainedValue”可以。然而这些不是相关的对,但是 passUnretained (+0) 与 passRetained (+1) 对立。你认为我应该删除这个问题,因为没有可能的理由或者不再是编码问题了吗?
-
我很高兴这对你有意义。不是讽刺。为了正确使用它们并能够审查代码,理解这些术语的含义很重要。
标签: swift unsafe-pointers