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

时间:2015-11-19 01:27:05

标签: objective-c swift swift-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)

这样可以从objc_getAssociatedObject调用中返回“xyz”。

但是,如果您从let f = "f"行中删除评论。 objc_getAssociatedObject调用现在返回nil。

我很困惑,如何设置一个完全不相关的变量可以影响通话。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

看起来像个错误。

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

那说他们显然做到了。所以我的猜测是,当您设置启动运行时的方法时会发生一些事情,类似于在NSUserDefaults上调用synchronize

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

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

let _ = "f"

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