了解 objc_setAssociatedObject 中的 UnsafeRawPointer



我想在 Swift 中为对象设置n关联对象的数量

我的理解是UnsafeRawPointer参考的通常模式是这样的......

static var reference = "someRef"
public func add(to myObject: AnyObject) {
let adding = ThingToAdd()        
objc_setAssociatedObject(myObject, &reference, adding, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}

但这不适用于n呼叫add(to:)

同样,如果我每myObject只调用一次,下面的代码工作正常。但是,如果我以相同的方式添加另一个关联的对象......它将第一个ThingToAdd替换为第二个。内联构建唯一的字符串不起作用。在模拟器上很好,但在设备上则不然。

public func add(to myObject: AnyObject) {
let adding = ThingToAdd()
var reference = "objectref(UUID().uuidString)".replacingOccurrences(of: "-", with: "")
objc_setAssociatedObject(myObject, reference, adding, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}

我知道这是不正确的,但是我不知道如何创建n数量的UnsafeRawPointers以存储具有唯一引用的关联对象。

任何帮助/解释将不胜感激。

reference传递给objc_setAssociatedObjectkey: UnsafeRawPointer参数会将变量存储的地址传递给该函数。

全局变量和静态成员变量(并且仅保证具有这些变量(具有固定地址。

在第一个版本中,对具有相同键objc_setAssociatedObject的第二个和所有后续调用将替换以前的关联。

在第二个版本中,局部变量的地址作为键传递。该地址在后续呼叫中可能相同,也可能不同。请注意,字符串的内容无关紧要,键只是一个指针,即该变量的地址。

如果您需要将可变数量的值与给定对象相关联,那么我建议关联单个NSMutableArray(或NSMutableDictionary(并将值添加到该数组或字典中。

最新更新