【问题标题】:Understanding UnsafeRawPointer in objc_setAssociatedObject了解 objc_setAssociatedObject 中的 UnsafeRawPointer
【发布时间】:2020-01-11 12:18:21
【问题描述】:

我想将 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 以存储具有唯一引用的关联对象。

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

【问题讨论】:

    标签: objective-c swift unsafe unsafe-pointers associated-object


    【解决方案1】:

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

    全局变量和静态成员变量(并且只有那些)保证有一个固定的地址。

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

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

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

    【讨论】:

    • 是的,有道理。我仍然希望有一种方法可以动态添加 n 数,但你是对的,它可以很容易地通过数组或字典来解决。
    猜你喜欢
    • 2017-03-30
    • 1970-01-01
    • 2017-09-14
    • 2014-10-08
    • 1970-01-01
    • 2012-12-05
    • 2010-12-27
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多