gpt4 book ai didi

swift - 新分配的对象之前可以在 Swift 中使用过 ObjectIdentifier 吗?

转载 作者:行者123 更新时间:2023-11-30 11:21:52 26 4
gpt4 key购买 nike

我想知道,新分配的对象是否可以以前使用过ObjectIdentifier(这基本上是从我假设的内存地址推断出来的)。

我正在对关联对象进行简单的实现,并且想知道这是否会将事情搞砸。

如果一个新对象实际上可以有一个以前使用过的地址,我想知道我们如何知道某些东西被释放并清理现有的关联。

private var associatedObjects: [String:Any] = [:]

func setAssociatedObject<T>(_ object: AnyObject, name: String, value: T) {
associatedObjects[associatedObjectKey(object, name: name)] = value
}

func getAssociatedObject<T>(_ object: AnyObject, name: String) -> T? {
return associatedObjects[associatedObjectKey(object, name: name)] as? T
}

private func associatedObjectKey(_ object: AnyObject, name: String) -> String {
return "\(ObjectIdentifier(object).hashValue)-\(name)"
}

最佳答案

ObjectIdentifiers(内存地址)确实可以重用,这个简单的代码片段证明了这一点

class C {}

print(ObjectIdentifier(C()))
print(ObjectIdentifier(C()))

了解对象何时解除分配的最佳方法可能是轮询弱变量:

class C {}

var o: C? = C()
weak var weakO = o
print("weakO == nil \(weakO == nil)")
o = nil
print("weakO == nil \(weakO == nil)")

或者,为了更方便,这样可以跟踪对象 ID 和对象是否仍然存在的信息:

class C {}

class ObjectWrapper {
weak var object: AnyObject?
var hash: Int

init(_ object: AnyObject) {
self.object = object
hash = ObjectIdentifier(object).hashValue
}
}

var obj1: C? = C()
let wrapper1 = ObjectWrapper(obj1!)
obj1 = nil

var obj2: C? = C()
let wrapper2 = ObjectWrapper(obj2!)

print("obj1 == nil: \(wrapper1.object == nil), hash: \(wrapper1.hash)")
print("obj2 == nil: \(wrapper2.object == nil), hash: \(wrapper2.hash)")

关于swift - 新分配的对象之前可以在 Swift 中使用过 ObjectIdentifier 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51174934/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com