Swift objc_getAssociatedObject 始终为零

标签 swift associated-object

我正在尝试将属性关联到数组扩展:

private var AssociatedObjectHandle: String = "BlaBLabla"
extension Array {
  var emptyIndex:Int {
    mutating get {
      if let object = objc_getAssociatedObject(self, &AssociatedObjectHandle) {
        return object as! Int
      }
      let index = self.searchEmptyIndex()
      self.emptyIndex = index

      return index
    }
    set {
      let new = (newValue as NSInteger)
      objc_setAssociatedObject(self, &AssociatedObjectHandle, new, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
    }
  }

  func searchEmptyIndex() -> Int {
      if let arr = self as? [Int] {
        return arr.index(of: -1)!
      }

      return -1
  }
}

objc_getAssociatedObject 调用总是返回 nil!!

有人知道为什么吗?

我在最后一个小时里一直在敲我的头......

最佳答案

不能将关联对象添加到 Swift Array(或任何 Swift 值类型)。 objc_setAssociatedObject()objc_getAssociatedObject() 来自 Objective-C 运行时,他们首先期望 NSObject 的实例 争论。

你的代码编译和运行只是因为任何 Swift 值都是自动的 必要时桥接到一个对象。

  • 当你调用 objc_setAssociatedObject(self, ...) 然后 self 桥接到 NSArray 的(临时)实例,并且关联 是在那个物体上制作的。

  • 稍后,当 objc_getAssociatedObject(self, ...) 被调用时, 另一个 NSArray 的(临时)实例被创建,并且那个 没有关联对象。

这就是您得到 nil 作为结果的原因。

关于Swift objc_getAssociatedObject 始终为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45859413/

相关文章:

ios - Objective-C 运行时关联对象与 NSMutable 字典

swift - 自定义相机的情侣问题

swift 5.0 : How to fix nw_path_close_fd Failed to close guarded necp fd 4 [9: Bad file descriptor] error

ios - 如何将关联对象与枚举一起使用?

python - 将使用 SubFactory 和 LazyAttribute 创建的对象传递给 factory_boy 中的 RelatedFactory

objective-c - 了解 objc_setAssociatedObject 中的 UnsafeRawPointer

ios - 谓词的核心数据提取请求错误

ios - 单击后 UITableViewCell 调整大小,约束发生变化

SWIFT - mailComposeDelegate 未调用 : cancel of MFMailComposeViewController doesn't work

iOS:在 UIColor 类别中为 -colorWithPatternImage: 抓取对象的边界?