使用 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"
我打赌分配变量会覆盖您手动设置的任何运行时关联。下划线只是告诉编译器您没有使用赋值的结果。
可以通过将此代码放在 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"
我打赌分配变量会覆盖您手动设置的任何运行时关联。下划线只是告诉编译器您没有使用赋值的结果。