因为 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))")
}
}
在 Release 模式下运行它会得到以下输出:
foo
foo
(()) -> ()
0x00007fff5fbff7d0
-> 0x100003f10
(()) -> ()
0x00007fff5fbff7d0
-> 0x100001f60
这表明编译器认为 f
和 bar[42]!
是相同的。令人困惑的是,同一个地址可以指向同一个闭包的不同副本。
最佳答案
&var
是包含原始内存位置地址的内存位置的地址(即,它是“指向指针的指针”)。
由于ff
和bar[]
是两个不同的变量,所以它们的地址也不同。
ff(18) bar(20) coolvalue(84)
[84]...[]...[84]...[].............[xxx]
关于swift - 同一对象不同地址。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40178886/