Python使用了垃圾回收器来自动销毁那些不再使用的对象。
每个对象都有一个引用计数,当这个引用计数为0时Python能够安全地销毁这个对象。
有些时候我们在模块内部引用外部数据,当这些外部数据无效时由于被模块内部引用,
这些数据即使外部想释放,也得不到释放。这种场景Weakref就派上用场了。
用例一:
说cocos2D中cocosNode应用,这里parent可能会被中间删除
删除后,如果在当前的Node用的是强引用,则父节点会一直停留在内存中。
def _set_parent(self, parent): if parent is None: self._parent = None else: self._parent = weakref.ref(parent)
def _get_parent(self): if self._parent is None: return None else: return self._parent()
如果python强引用C,C++中的对象,则内存是不能被free的。
注意:
(1)弱引用定义有两种方式,a = weakref.ref(b)的形式,在使用a的时候需要加上括号,a = weakref.proxy(b)的形式,在使用的时候不需要。
弱引用不能用于int等简单类型。
(2)有__slot__的类不支持weakref