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

标签 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))")
    }
}

在 Release 模式下运行它会得到以下输出:

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

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

最佳答案

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

由于ffbar[]是两个不同的变量,所以它们的地址也不同。

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

关于swift - 同一对象不同地址。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40178886/

相关文章:

c++ - 二维数组重新分配

android - Geocoder 适用于 1.6 但不适用于 2.2 模拟器

java - 迭代并比较同一映射中的值以找到最大值并从同一映射中删除其他值

javascript - 如何从键值对数组中获取对象数组

xcode - 为什么我的计时器在 Swift 中不倒计时到 0?

ios - Swift:如何实现自定义 AutoSegue

ios - Swift - 如何将 ConstUnsafePointer<()> 转换为 CTRunRef

ios - 如何在 SwiftUI 环境中实现子上下文(CoreData)?

c++ - 将指针作为内存地址传递并使其永久化

c - 左值要求错误