同一对象的地址不同。为什么?

时间:2016-10-21 14:11:12

标签: swift pointers dictionary closures

由于fbar[42]!都指向以下代码中的相同闭包,我希望不安全指针指向同一个地址。 他们不。有人可以解释一下原因吗?

澄清一下:我在Xcode中使用"查看内存"查找withUnsafePointer返回的地址。

var bar = [Int : (() -> Void)]()

bar[42] = { print("foo") }

var f = bar[42]!

f() // prints "foo"

bar[42]!() // prints "foo"

withUnsafePointer(to: &f) { print( type(of: $0) ) ; print( $0 ) }
// UnsafePointer<(()) -> ()> 0x00007fff5fbff778 -> 0x100002100

withUnsafePointer(to: &bar[42]!) { print( type(of: $0) ) ; print($0) }
// UnsafePointer<(()) -> ()> 0x00007fff5fbff760 -> 0x100001d20

更新

我已更新代码以打印出指针的值:

var bar = [Int : (() -> Void)]()

bar[42] = { print("foo") }

var f = bar[42]!

f() // prints "foo"

bar[42]!() // prints "foo"

withUnsafePointer(to: &f) {
    print( type(of: $0.pointee) )
    print( $0 )
    $0.withMemoryRebound(to: Int.self, capacity: 1) {
        print("-> 0x\(String($0.pointee, radix: 16))")
    }
}

withUnsafePointer(to: &bar[42]!) {
    print( type(of: $0.pointee) )
    print($0)
    $0.withMemoryRebound(to: Int.self, capacity: 1) {
        print("-> 0x\(String($0.pointee, radix: 16))")
    }
}

在发布模式下运行此命令会提供以下输出:

foo
foo
(()) -> ()
0x00007fff5fbff7d0
-> 0x100003f10
(()) -> ()
0x00007fff5fbff7d0
-> 0x100001f60

这表明编译器发现fbar[42]!是相同的。令人困惑的是,相同的地址可以指向同一个闭包的不同副本。

1 个答案:

答案 0 :(得分:0)

&var是包含原始内存位置地址的内存位置的地址(即,它是&#34;指向指针的指针&#34;)。

ff&amp; bar[]是两个不同的变量,它们的地址也不同。

 ff(18)     bar(20)            coolvalue(84)
 [84]...[]...[84]...[].............[xxx]