由于f
和bar[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
这表明编译器发现f
和bar[42]!
是相同的。令人困惑的是,相同的地址可以指向同一个闭包的不同副本。
答案 0 :(得分:0)
&var
是包含原始内存位置地址的内存位置的地址(即,它是&#34;指向指针的指针&#34;)。
自ff
&amp; bar[]
是两个不同的变量,它们的地址也不同。
ff(18) bar(20) coolvalue(84)
[84]...[]...[84]...[].............[xxx]