我正在使用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。所以&#34; passUnretained&#34;没有保留,但是&#34; takeUnretainedValue&#34;那样。
更改为&#34; takeRetainedValue&#34;修复问题,并导致预期的崩溃。输出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))
}
因此,总结一下,&#34; takeRetainedValue&#34;不保留价值。
更新:我已编辑此问题以删除一些以前令人困惑的语句,并将其返回到基本的编程问题。
答案 0 :(得分:0)
实际上,事实证明&#34; takeUnretainedValue&#34;不保留值,而是在返回值后由赋值本身完成。
我测试过并发现只要&#34; passRetained&#34;用于&#34; takeRetained&#34; &#34; passUnretained&#34;使用&#34; takeUnretained&#34;,然后变量不会泄漏,由于添加了新变量,它只是+1。
func test1() -> UnsafeMutableRawPointer {
let str = aaa();
print(CFGetRetainCount(str))
let ptr1 = Unmanaged.passRetained(str).toOpaque()
print(CFGetRetainCount(str))
let str2 = Unmanaged<aaa>.fromOpaque(ptr1).takeRetainedValue();
print(CFGetRetainCount(str2))
print(str2);
print("111");
print(str.b)
return ptr1;
}
let ptr4 = test1();
let str4 = Unmanaged<aaa>.fromOpaque(ptr4).takeUnretainedValue();
print(CFGetRetainCount(str4))
print(str4.b);
这是一个测试,显示takeUnretainedValue不会增加引用计数(删除了赋值,但无论如何都调用了函数)。
func test1() {
let str = aaa();
print(CFGetRetainCount(str))
let ptr1 = Unmanaged.passUnretained(str).toOpaque()
print(CFGetRetainCount(str))
Unmanaged<aaa>.fromOpaque(ptr1).takeUnretainedValue();
print(CFGetRetainCount(str))
//print(str2);
print("111");
print(str.b)
}
类似的测试显示&#34; takeRetainedValue&#34;减少保留计数。它指的是&#34;额外保留&#34;来自passRetained,并返回它开始时的值。如果分配,它也会被赋予+1。