使用 objc_getAssociatedObject() 时出现奇怪的 Swift 行为

Strange Swift behaviour when using objc_getAssociatedObject()

可以通过将此代码放在 playground 中来观察行为:

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)

这有效并且 returns "xyz" 来自 objc_getAssociatedObject 调用。

但是,如果您从 let f = "f" 行中删除注释。 objc_getAssociatedObject 现在调用 returns 零。

我对设置一个完全不相关的变量如何影响调用感到困惑。

有什么想法吗?

看起来像一个错误。

objc_... 方法是 Objective-C 运行时的一部分。他们不应该存在于Swift。

他们显然是这么说的。所以我的猜测是,当您设置启动运行时的方法时会发生一些事情,类似于在 NSUserDefaults.

上调用 synchronize

编辑: This NSHipster article 解释说 ObjC 运行时实际上在那里。

编辑 2: 我尝试了一些实验,我会让你的问题更奇怪。将测试用例包装在对象内会产生相同的结果。但是将变量名更改为下划线可以解决问题:

let _ = "f"

我打赌分配变量会覆盖您手动设置的任何运行时关联。下划线只是告诉编译器您没有使用赋值的结果。