是否可以使用`__FUNCTION__`作为`objc_getAssociatedObject`的键

时间:2015-11-19 12:00:55

标签: swift

在Objective-C中,可以使用_cmd作为objc_getAssociatedObject的密钥,如NSHipster article中所述。在Swift中,只有__FUNCTION___cmd具有相同的用途。但我不确定这样做是否安全。

2 个答案:

答案 0 :(得分:2)

objc_getAssociatedObject()需要唯一指针作为键。 在Objective-C中,_cmd具有类型SEL,它是一个指针,并且是 根据参考文章的独特之处。

在Swift中,__FUNCTION__的类型String不是指针。 当传递给期望指针的函数时,字符串是 已转换(可能与Swift, Strings and Memory Addresses中的NSString一样)。这不保证 转换在每次调用中产生相同的指针。这是一个简单的 演示Playground中问题的示例:

func bar(ptr : UnsafePointer<Void>) {
    print(ptr)
}

func foo() {
    bar(__FUNCTION__)
    bar(__FUNCTION__)
}

foo()

输出:

0x00007f8173c06500
0x00007f8173e00020

正如您所看到的,相同的__FUNCTION__被传递为两个不同的 指向bar()函数的指针。

似乎在已编译的项目中,您将获得相同的指针 每个电话,但据我所知 - 没有记录,从那以后 它在游乐场不起作用我不会依赖它。

因此我认为使用__FUNCTION__不安全 关联对象的关键。

安全的方法是使用全局属性的地址 如在Is there a way to set associated objects in Swift?中那样。

答案 1 :(得分:1)

将其用作关键字可以,它只是一个String字面值。但是,在使用Swift时,您应该尽量避免使用objc_getAssociatedObject和objective-c运行时,因为它不支持所有类型,并且违反了Swift中的安全性。希望手指交叉我们将使用Swift 3看到更多动态内省功能。