是否可以从ObjectIdentifier重新访问对象

例如:

let controller = UIViewController() //assume controller has strong ref so it's not going to deallocate instantly
let id = ObjectIdentifier(controller)


所以如何使用它的ObjectIdentifier访问控制器

最佳答案

不,这是不可能的。
ObjectIdentifier在开源的Swift标准库中声明,因此我们可以从GitHub中查看其实现的摘要(我已经剔除了非必要的代码和注释):

@frozen
public struct ObjectIdentifier {

  internal let _value: Builtin.RawPointer

  public init(_ x: AnyObject) {
    self._value = Builtin.bridgeToRawPointer(x)
  }

  public init(_ x: Any.Type) {
    self._value = unsafeBitCast(x, to: Builtin.RawPointer.self)
  }
}

我们看到实现的存储的_value被标记为internal,因此您将完全无法从其他模块中定义的代码访问它。此外,仅存储指向该对象的指针,这意味着无论如何都无法“直接”访问该对象。

最好的选择是只是围绕对象,并在需要时创建ObjectIdentifier。另外,您可以在自己的模块中重新实现ObjectIdentifier,以便能够访问基础对象/指针。

关于ios - 通过ObjectIdentifier访问对象(指针),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59877618/

10-12 00:19