将此代码放在游乐场中可以观察到此行为:
import Foundation
import ObjectiveC
class TestClass {}
var obj = TestClass()
let stringValue = "xyz"
let key = "def"
objc_setAssociatedObject(obj, key, stringValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
//let f = "f"
let returnedString = objc_getAssociatedObject(obj, key)
这样可以从objc_getAssociatedObject
调用中返回“xyz”。
但是,如果您从let f = "f"
行中删除评论。 objc_getAssociatedObject
调用现在返回nil。
我很困惑,如何设置一个完全不相关的变量可以影响通话。
有什么想法吗?
答案 0 :(得分:1)
看起来像个错误。
objc _...方法是Objective-C运行时的一部分。他们不应该存在于Swift中。
那说他们显然做到了。所以我的猜测是,当您设置启动运行时的方法时会发生一些事情,类似于在NSUserDefaults上调用synchronize
。
编辑: This NSHipster article解释说ObjC运行时实际存在。
编辑2:我尝试了一些实验,我会让你的问题变得更奇怪。将测试用例包装在对象内部会产生相同的结果。但是将变量名称更改为下划线可以解决问题:
let _ = "f"
我敢打赌,分配变量会覆盖您手动设置的任何运行时关联。下划线只是告诉编译器你没有使用赋值的结果。