获取函数的地址 [Swift 3.0]

kod*_*r16 5 memory pointers ios swift

AnyObject您可以通过函数调用获取函数的地址unsafeAdressOf(object:AnyObject) -> UnsafePointer<void>,但是如何获取函数的地址呢?例如

func foo(){print("hi")}
print(unsafeAdressOf(foo))
Run Code Online (Sandbox Code Playgroud)

不起作用

Tan*_*Jin 4

class Foo {
    func poo(value: Int) {
        print(value)
    }
}
typealias classFunctionType = @convention(thin) (Foo)->(Int)->()

func getSwiftFunctionAddr(_ function: @escaping classFunctionType) -> UnsafeMutableRawPointer {
    return unsafeBitCast(function, to: UnsafeMutableRawPointer.self)
}

let func_addr = getSwiftFunctionAddr(Foo.poo)

print(func_addr)
Run Code Online (Sandbox Code Playgroud)

  • 为了后代:在第二个示例中,官方不支持的“@convention(thin)”使 Swift 将函数类型“NewSwiftNSLog”的值存储为简单指针。一旦我们欺骗它使用一个简单的指针,剩下要做的就是通过“unsafeBitCast”将其泵入“用户空间”,就像以前一样。 (3认同)
  • 对于用 C 表示的函数,支持更多的“@convention(c)”属性也适用。 (2认同)