Может ли недавно выделенный объект ранее использовать ObjectIdentifier в Swift? - PullRequest
0 голосов
/ 04 июля 2018

Интересно, может ли недавно выделенный объект ранее использовать 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)"
}

1 Ответ

0 голосов
/ 05 июля 2018

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)")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...