了解 objc_setAssociatedObject 中的 UnsafeRawPointer

Understanding UnsafeRawPointer in objc_setAssociatedObject

我想将 n 个关联对象设置为 Swift

中的一个对象

我的理解是 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)并将值添加到该数组或字典中。