gpt4 book ai didi

swift - 可以使用 `__FUNCTION__` 作为 `objc_getAssociatedObject` 的 key 吗

转载 作者:可可西里 更新时间:2023-11-01 01:02:58 25 4
gpt4 key购买 nike

在 Objective-C 中,可以使用 _cmd 作为 objc_getAssociatedObject 的键,如 NSHipster article 中所述.在 Swift 中,只有 __FUNCTION__ 的作用与 _cmd 相似。但我不确定这样做是否安全。

最佳答案

objc_getAssociatedObject() 需要一个唯一指针 作为键。在 Objective-C 中,_cmd 的类型是 SEL,它是一个指针,并且是根据引用文章是独一无二的。

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

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

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

foo()

输出:

0x00007f8173c06500
0x00007f8173e00020

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

似乎在编译的项目中你会得到相同的指针每次通话,但据我所知,这是没有记录的,因为它在 Playground 中不起作用,我不会依赖它。

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

一种安全的方法是使用全局属性的地址如 Is there a way to set associated objects in Swift? .

关于swift - 可以使用 `__FUNCTION__` 作为 `objc_getAssociatedObject` 的 key 吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33803370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com