为什么Swift" Managed.fromOpaque.takeUnretainedValue()"保留价值?

时间:2017-01-20 22:26:09

标签: swift unsafe-pointers

我正在使用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;不保留价值。

更新:我已编辑此问题以删除一些以前令人困惑的语句,并将其返回到基本的编程问题。

1 个答案:

答案 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。