juce 中的WeakReference分析
juce中的WeakReference设计得比较巧妙,巧妙就是使用delete之后就可以通知道WeakReference,原理其实也很间单,其实就是在对象里添加了一个子对象masterReference,对象在析构的时候主动调用masterReference.clear();,这样来达到通知弱指针的这个对象已经销毁了,可以设置为空了的目的。 感觉juce最后调用个clear还是觉得有点生硬,外层最好还是再嵌套一层,析构的时候自动调用clear就可以了,对象申明也写成宏,这样的话就简洁多了。
使用方法也很简单:
- /==============================================================================
- /**
- This class acts as a pointer which will automatically become null if the object
- to which it points is deleted.
- To accomplish this, the source object needs to cooperate by performing a couple of simple tasks.
- It must embed a WeakReference::Master object, which stores a shared pointer object, and must clear
- this master pointer in its destructor.
- E.g.
- @code
- class MyObject
- {
- public:
- MyObject()
- {
- // If you're planning on using your WeakReferences in a multi-threaded situation, you may choose
- // to create a WeakReference to the object here in the constructor, which will pre-initialise the
- // embedded object, avoiding an (extremely unlikely) race condition that could occur if multiple
- // threads overlap while creating the first WeakReference to it.
- }
- ~MyObject()
- {
- // This will zero all the references - you need to call this in your destructor.
- masterReference.clear();
- }
- private:
- // You need to embed a variable of this type, with the name "masterReference" inside your object. If the
- // variable is not public, you should make your class a friend of WeakReference<MyObject> so that the
- // WeakReference class can access it.
- WeakReference<MyObject>::Master masterReference;
- friend class WeakReference<MyObject>;
- };
- // Here's an example of using a pointer..
- MyObject* n = new MyObject();
- WeakReference<MyObject> myObjectRef = n;
- MyObject* pointer1 = myObjectRef; // returns a valid pointer to 'n'
- delete n;
- MyObject* pointer2 = myObjectRef; // returns a null pointer
- @endcode
- @see WeakReference::Master
- */
源码如下:
- #ifndef JUCE_WEAKREFERENCE_H_INCLUDED
- #define JUCE_WEAKREFERENCE_H_INCLUDED
- /
- template <class ObjectType, class ReferenceCountingType = ReferenceCountedObject>
- class WeakReference
- {
- public:
- /** Creates a null SafePointer. */
- inline WeakReference() noexcept {}
- /** Creates a WeakReference that points at the given object. */
- WeakReference (ObjectType* const object) : holder (getRef (object)) {}
- /** Creates a copy of another WeakReference. */
- WeakReference (const WeakReference& other) noexcept : holder (other.holder) {}
- /** Copies another pointer to this one. */
- WeakReference& operator= (const WeakReference& other) { holder = other.holder; return *this; }
- /** Copies another pointer to this one. */
- WeakReference& operator= (ObjectType* const newObject) { holder = getRef (newObject); return *this; }
- #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS
- WeakReference (WeakReference&& other) noexcept : holder (static_cast<SharedRef&&> (other.holder)) {}
- WeakReference& operator= (WeakReference&& other) noexcept { holder = static_cast<SharedRef&&> (other.holder); return *this; }
- #endif
- /** Returns the object that this pointer refers to, or null if the object no longer exists. */
- ObjectType* get() const noexcept { return holder != nullptr ? holder->get() : nullptr; }
- /** Returns the object that this pointer refers to, or null if the object no longer exists. */
- operator ObjectType*() const noexcept { return get(); }
- /** Returns the object that this pointer refers to, or null if the object no longer exists. */
- ObjectType* operator->() noexcept { return get(); }
- /** Returns the object that this pointer refers to, or null if the object no longer exists. */
- const ObjectType* operator->() const noexcept { return get(); }
- /** This returns true if this reference has been pointing at an object, but that object has
- since been deleted.
- If this reference was only ever pointing at a null pointer, this will return false. Using
- operator=() to make this refer to a different object will reset this flag to match the status
- of the reference from which you're copying.
- */
- bool wasObjectDeleted() const noexcept { return holder != nullptr && holder->get() == nullptr; }
- bool operator== (ObjectType* const object) const noexcept { return get() == object; }
- bool operator!= (ObjectType* const object) const noexcept { return get() != object; }
- //==============================================================================
- /** This class is used internally by the WeakReference class - don't use it directly
- in your code!
- @see WeakReference,
- */
- class SharedPointer : public ReferenceCountingType
- {
- public:
- explicit SharedPointer (ObjectType* const obj) noexcept : owner (obj) {}
- inline ObjectType* get() const noexcept { return owner; }
- void clearPointer() noexcept { owner = nullptr; }
- private:
- ObjectType* volatile owner;
- JUCE_DECLARE_NON_COPYABLE (SharedPointer)
- };
- typedef ReferenceCountedObjectPtr<SharedPointer> SharedRef;
- //==============================================================================
- /**
- This class is embedded inside an object to which you want to attach WeakReference pointers.
- See the WeakReference class notes for an example of how to use this class.
- @see WeakReference
- */
- class Master
- {
- public:
- Master() noexcept {}
- ~Master() noexcept
- {
- // You must remember to call clear() in your source object's destructor! See the notes
- // for the WeakReference class for an example of how to do this.
- jassert (sharedPointer == nullptr || sharedPointer->get() == nullptr);
- }
- /** The first call to this method will create an internal object that is shared by all weak
- references to the object.
- */
- SharedPointer* getSharedPointer (ObjectType* const object)
- {
- if (sharedPointer == nullptr)
- {
- //先用智能指针给包装起来
- sharedPointer = new SharedPointer (object);
- }
- else
- {
- // You're trying to create a weak reference to an object that has already been deleted!!
- jassert (sharedPointer->get() != nullptr);
- }
- return sharedPointer;
- }
- /** The object that owns this master pointer should call this before it gets destroyed,
- to zero all the references to this object that may be out there. See the WeakReference
- class notes for an example of how to do this.
- */
- void clear() noexcept
- {
- if (sharedPointer != nullptr)
- sharedPointer->clearPointer();
- }
- private:
- SharedRef sharedPointer;
- JUCE_DECLARE_NON_COPYABLE (Master)
- };
- private:
- SharedRef holder;
//这里看出取得了object里的masterReference,所以使用的对象必需要包含这个成员,getSharedPointer返回一个SharedPointer的智能指针,而SharedPointer里包装了真正的对象的指针,由于SharedPointer被智能指针包着,所以弱引用的对象被删除了,这个
- SharedPointer仍然存在,但它里面的指针对象由于clear被设置为null,这里再调用get自然就知道对象是否被删除
- static inline SharedPointer* getRef (ObjectType* const o) { return (o != nullptr) ? o->masterReference.getSharedPointer (o) : nullptr; } }; #endif // JUCE_WEAKREFERENCE_H_INCLUDED
juce 中的WeakReference分析的更多相关文章
- juce中的BailOutChecker
界面库中值得注意的一点就是对象响应事件的时候自身被删除了,那么后续的访问自然就会出问题,所以需要在响应事件之后先添加引用,相关处理之后再查看自身是否已经被删除,如果已经被删除那么就直接退出.juce中 ...
- juce中的timer
juce中timer总体说还是比较好用的,使用时只需继承timer类, 重写callback然后调用start就可以了,juce的timer比较特别,自己通过线程实现,starttimer的时候会创建 ...
- Android中AppWidget的分析与应用:AppWidgetProvider .
from: http://blog.csdn.net/thl789/article/details/7887968 本文从开发AppWidgetProvider角度出发,看一个AppWidgetPrv ...
- JAVA WEB 中的编码分析
JAVA WEB 中的编码分析 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src {background-co ...
- Android 中图片压缩分析(上)
作者: shawnzhao,QQ音乐技术团队一员 一.前言 在 Android 中进行图片压缩是非常常见的开发场景,主要的压缩方法有两种:其一是质量压缩,其二是下采样压缩. 前者是在不改变图片尺寸的情 ...
- 《构建之法》教学笔记——Python中的效能分析与几个问题
<构建之法:现代软件工程>中第2章对效能分析进行了介绍,基于的工具是VSTS.由于我教授的学生中只有部分同学选修了C#,若采用书中例子讲解,学生可能理解起来比较困难.不过所有这些学生都学习 ...
- Apollo配置中心源码分析
Apollo配置中心源码分析 1. apollo的核心代码分享 SpringApplication启动的关键步骤 在SpringApplication中,会加载所有实现了Init方法的类 protec ...
- HanLP中人名识别分析
HanLP中人名识别分析 在看源码之前,先看几遍论文<基于角色标注的中国人名自动识别研究> 关于命名识别的一些问题,可参考下列一些issue: 名字识别的问题 #387 机构名识别错误 关 ...
- linux内核中链表代码分析---list.h头文件分析(一)【转】
转自:http://blog.chinaunix.net/uid-30254565-id-5637596.html linux内核中链表代码分析---list.h头文件分析(一) 16年2月27日17 ...
随机推荐
- QJson 的使用
下载 源码解压 https://github.com/flavio/qjson 复制 src 目录下所有 .h .cpp .hh 文件到项目目录 qjson,pro 文件添加 INCLUDEPATH ...
- Windows下Vundle安装
鼠标手老是发作,没办法.想学习vim尽量减少编码时使用鼠标的频率.安装好gVim开始安装Vundle插件,总结下安装过程和各种遇到的坑: github上VundleVim倒是有说明 Windows S ...
- Java之定时任务详解
在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现.下面就其原理.实例以及Timer缺陷三个方面来解析java Timer定时器. 在 ...
- js 常用正则表达式(不断维护中)
身份证:pattern="/^[1-9]{1}[0-9]{14}$|^[1-9]{1}[0-9]{16}([0-9]|[xX])$/"
- Font Awesome 4.0.3 字体图标完美兼容IE7
1.下载Font Awesome 4.0.3兼容包,http://www.thinkcmf.com/index.php?m=font 2.解压,并放到自己网站系统合适的位置(如果你的站已使用Font ...
- 自定义filter
class md5_filter extends php_user_filter{ public function filter($in,$out,&$consumed,$closing){ ...
- STL初步
1.stackstack 模板类的定义在<stack>头文件中.stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要的,在不指定容器类型时,默认的容器类型 ...
- Python学习 常识+基础基础
特点: 优雅,明确,简单 领域: web网站 网络服务 系统工具和脚本 跨平台 对缩进要求严格 注释:# 动态语言:变量本身类型不固定 raw字符串与 多行字符串 raw字符串: 不需要转义字 ...
- ModelMap和ModelAndView(转)
转自:http://bao1073740756-126-com.iteye.com/blog/1549597 首先介绍ModelMap和ModelAndView的作用 ModelMap ModelMa ...
- 浅谈38K红外发射接受编码
之前做接触过一次红外遥控器,现在有空想用简单的话来聊一聊,下面有错误的地方欢迎改正指出:1:红外的概念不聊,那是一种物理存在.以下聊38K红外发射接收,主要讲可编程的红外编码.2:红外遥控 红外遥控首 ...