Weakref应用

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)

这里需要注意的是,当引用的数据被删除时,self._parent变为None
所以在使用的地方一定要先判断非None,比如cocos2D中用法如下:

    def _get_parent(self):
        if self._parent is None: return None
        else: return self._parent()

用例二:
当python引用C,C++中的对象时,同样会出现类似的问题

如果python强引用C,C++中的对象,则内存是不能被free的。


注意:

(1)弱引用定义有两种方式,a = weakref.ref(b)的形式,在使用a的时候需要加上括号,a = weakref.proxy(b)的形式,在使用的时候不需要。

弱引用不能用于int等简单类型。

(2)有__slot__的类不支持weakref


《本节完》


你可能感兴趣的:(cocos2d,Weakref)