【问题标题】:Get the address of a function [Swift 3.0]获取函数的地址 [Swift 3.0]
【发布时间】:2016-12-05 21:14:13
【问题描述】:

您可以通过unsafeAdressOf(object:AnyObject) -> UnsafePointer<void> 函数调用获得AnyObject 的地址,但我怎样才能获得函数的地址?例如

func foo(){print("hi")}
print(unsafeAdressOf(foo))

没用

【问题讨论】:

  • 无法提供。如果您可以展示获取地址所需的用例,那么有人会向您展示更好的解决方案。
  • 作为一个用例,如何创建一个函数地址字典作为键,其值是要调用的其他函数?然后,当操作系统调用您的 validateMenuItem() 函数并向您传递 NSMenuItem 引用时,您可以快速在字典中查找操作函数并找到要调用的函数以启用或禁用菜单项,而无需巨大的 switch 语句或其他可怕的机制。它避免了为每个菜单项创建一个出口来做同样的事情(如果菜单项本身是可散列的)。只是一个想法。

标签: ios swift pointers memory


【解决方案1】:
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)

【讨论】:

  • 请将链接内容添加到您的 asnwer 中
  • 为了后代:在第二个示例中,官方不支持的 @convention(thin) 使 Swift 将函数类型 NewSwiftNSLog 的值存储为一个简单的指针。一旦我们欺骗它使用一个简单的指针,剩下要做的就是通过unsafeBitCast 将它的值偷运到“用户空间”中。
  • 对于可在 C 中表示的函数,更受支持的 @convention(c) 属性也适用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 2014-02-18
  • 1970-01-01
相关资源
最近更新 更多