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)")
Или, чтобы сделать его более удобным, можно отследить как идентификатор объекта, так и знание того, находится ли объект еще вокруг:
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)")