gpt4 book ai didi

objective-c - 使用 objc_getAssociatedObject() 时奇怪的 Swift 行为

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

可以通过将这段代码放在 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。

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

有什么想法吗?

最佳答案

看起来像一个错误。

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

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

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

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

let _ = "f"

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

关于objective-c - 使用 objc_getAssociatedObject() 时奇怪的 Swift 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33793679/

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