gpt4 book ai didi

ios - Swift中的关联对象,全局键是否实际产生特定实例?

转载 作者:行者123 更新时间:2023-11-28 08:18:22 24 4
gpt4 key购买 nike

要在 Swift 中关联对象,只需使用内存地址作为句柄,然后使用 objc 调用即可。

您可以随处搜索的常用示例代码是:

var keyA:UInt8 = 0
var keyB:UInt8 = 0
extension UIViewController {

var aoAA: String? {
get { return objc_getAssociatedObject(self, &keyA) as? String }
set { objc_setAssociatedObject(self, &keyA, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) }
}
var aoBB: String? {
get { return objc_getAssociatedObject(self, &keyB) as? String }
set { objc_setAssociatedObject(self, &keyB, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) }
}
}

这很好用,

class Thing: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
aoAA = "this is a"
print("...... \(aoAA)")
aoBB = "this is b"
print("...... \(aoBB)")
aoAA = "changed A"
print("...... \(aoAA) \(aoBB)")
aoBB = "changed B"
print("...... \(aoAA) \(aoBB)")
aoAA = aoBB
print("...... \(aoAA) \(aoBB)")
}

但是等等......

句柄,keyA 和 keyB,对整个项目都是全局的

当您在不同 UIViewController 中使用 aoAA 和 aoBB 时,aoAA 和 aoBB 怎么可能充当特定于该实例的属性?

项目中肯定只有“一个”aoAA吗?

也就是说,aoAA 是全局的——就像句柄 keyA 是全局的一样?

我的测试似乎表明它们自变量,特定于不同 UIViewController 的不同实例,但这似乎很愚蠢。

aoAA 的每个实例怎么可能不同 - 它使用相同的全局句柄?

最佳答案

Objective-C 的“关联对象”概念允许您将一个“目标”对象实例与一个“源”对象实例连接起来。这是一个单向关联,只有源知道目标:

Associated Objects with source and target instances

objc_setAssociatedObject(source, key, target, ...)

关联使用一个键能够将任意数量的关联对象与一个源连接起来并加以区分。 key 显然必须不同——但仅适用于一个源实例。

因为您必须同时提供键和源实例来检索关联的对象,所以没有必要使用真正唯一的键。 objc_***AssociatedObject的实现可以通过实例指针和键组合形成进程唯一键。

因此对于您的示例,是的,aoAAaoBB 都会为每个 UIViewController 实例返回单独的值,即使 keyA keyB 是全局的。

绝对清楚,您确实需要为给定扩展中的每个关联对象使用不同键。因此,aoAAaoBB 每个都需要自己的 key ,如示例代码所示(即指向 keyA 的指针键B)。但是正如问题中所问的那样,每个 关联对象只有 一个 键是正确的,无论扩展在多少个符合类中使用。

关于ios - Swift中的关联对象,全局键是否实际产生特定实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41942625/

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