Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 获取函数的地址[Swift 3.0]_Ios_Swift_Pointers_Memory - Fatal编程技术网

Ios 获取函数的地址[Swift 3.0]

Ios 获取函数的地址[Swift 3.0],ios,swift,pointers,memory,Ios,Swift,Pointers,Memory,您可以使用unsafeAdressOf(object:AnyObject)->UnsafePointer函数调用获取AnyObject的地址,但如何获取函数的地址?比如说 func foo(){print("hi")} print(unsafeAdressOf(foo)) 不起作用没有办法。如果你能展示获得地址所需的用例,有人会向你展示一个更好的解决方案。作为一个用例,如何创建一个函数地址字典,将其作为键,其中的值是其他函数要调用的值?然后,当操作系统调用validateNuItem()函数并

您可以使用
unsafeAdressOf(object:AnyObject)->UnsafePointer
函数调用获取
AnyObject
的地址,但如何获取函数的地址?比如说

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

不起作用

没有办法。如果你能展示获得地址所需的用例,有人会向你展示一个更好的解决方案。作为一个用例,如何创建一个函数地址字典,将其作为键,其中的值是其他函数要调用的值?然后,当操作系统调用validateNuItem()函数并向您传递NSMenuItem引用时,您可以在字典中快速查找操作函数并找到要调用的函数来启用或禁用菜单项,而无需使用巨大的switch语句或其他可怕的机制。它避免了为每个菜单项创建一个出口来完成同样的事情(如果菜单项本身可以散列)。只是一个想法。请为您的ASN添加链接内容以供后代使用:在第二个示例中,官方不支持的
@convention(thin)
使Swift将函数类型
newswitnslog
的值存储为一个简单指针。一旦我们诱使它使用一个简单的指针,剩下要做的就是通过
unsafeBitCast
将值走私到“用户空间”,就像它一样。对于用C表示的函数,更受支持的
@convention(C)
属性也可以工作。
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)