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

时间:2018-07-04 13:30:57

标签: swift memory

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

我正在使用关联对象的这种简单实现,想知道这是否会使事情搞砸。

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

    Firestore.instance.runTransaction((transaction) async {
          await transaction.set(Firestore.instance.collection("your_collection").document(), {
            'replyName': replyName,
            'replyText': replyText,
            'replyVotes': replyVotes,
          });
        });

1 个答案:

答案 0 :(得分:0)

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)")