解决循环引用的一个例子
2012-08-29 23:57
253 查看
最近在讨论设计时注意到一个循环引用的问题。它是在使用引用计数指针时发生的。如下图所示:
ClassA和ClassB分属两个不同的线程,ClassB通常由ClassA发起请求创建,并由ClassA使用,ClassB则会在必要时通知ClassA一些事件。两者中各保留了对方的一个引用计数指针RefPtr。
如果在析构时释放成员变量的话,就会发生循环引用的问题,导致两个对象释放失败。
最直接的解决方法(不考虑弱引用指针)就是将释放指针的操作显示定义成函数,与析构函数分离开来,并在析构前确保调用这个函数来释放所使用的引用计数指针。定义一个clear函数来做这件事。为了有效释放使用的资源,在clear()中还可以做一些其它的清理操作: (下图是OwnerOfClassA对ClassA的释放过程,ClassB对应的操作相同)
但这时ClassA与ClassB耦合高,且双引用的情况最好针对轻量级的指针,以使资源使用效率提高。为此要将ClassA与ClassB解耦。一种方式就是使用一个代理,封装ClassB的实现。将原先的需要通知ClassA的事件使用观察者模式隐藏ClassA的接口。
如下图所示:
ClassA和ClassB分属两个不同的线程,ClassB通常由ClassA发起请求创建,并由ClassA使用,ClassB则会在必要时通知ClassA一些事件。两者中各保留了对方的一个引用计数指针RefPtr。
如果在析构时释放成员变量的话,就会发生循环引用的问题,导致两个对象释放失败。
最直接的解决方法(不考虑弱引用指针)就是将释放指针的操作显示定义成函数,与析构函数分离开来,并在析构前确保调用这个函数来释放所使用的引用计数指针。定义一个clear函数来做这件事。为了有效释放使用的资源,在clear()中还可以做一些其它的清理操作: (下图是OwnerOfClassA对ClassA的释放过程,ClassB对应的操作相同)
但这时ClassA与ClassB耦合高,且双引用的情况最好针对轻量级的指针,以使资源使用效率提高。为此要将ClassA与ClassB解耦。一种方式就是使用一个代理,封装ClassB的实现。将原先的需要通知ClassA的事件使用观察者模式隐藏ClassA的接口。
如下图所示:
相关文章推荐
- 封装一个GCD定时器,彻底解决定时器循环引用、释放时机问题
- 解决曾经一个父布局循环添加子布局错误例子
- shared_ptr循环引用的例子及解决方法示例
- Xcode8调试黑科技:Memory Graph实战解决闭包引用循环问题
- 非常简单的一个for-each循环例子
- 一个For语句导致死循环的例子
- PHP的foreach中使用引用时需要注意的一个问题和解决方法
- for循环的一个例子
- c#,EXCEL 找不到编译动态表达式所需的一个或多个类型。是否缺少引用?解决办法
- js的一个有意思的小题,闭包解决getElementByTagName的for循环绑定事件错误问题
- 另外一个通过生成excel解决web打印方案的例子
- 给出一个现实中的例子,然后用pv操作解决它。
- 解决用户控件循环引用问题
- 记录一个xp下运行cocos2d-x tests例子报错的解决过程
- Java中一个运用反射解决问题例子+思考
- ant 编译build时引用软件包找不到的解决例子
- 一个多线程死锁的问题,一个循环引用的问题
- LINQ TO SQL学习笔记(3)_解决通用基类的循环引用问题
- 在springmvc中解决FastJson循环引用的问题
- ios Block解决循环引用和回传值