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 ...
随机推荐
- 查看并设置oracle并发连接数
1.Sql代码1.select count(*) from v$process select count(*) from v$process --当前的数据库连接数2.Sql代码1.select v ...
- WindowsForm 流
流 包括输入流代码 输出流代码 流: 输入流: string filename = openFileDialog1.FileName; //通过读入流进行文件读取 StreamReader sr = ...
- Spring Annotation注解进行aop的学习
使用Maven管理项目,pom文件为: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=" ...
- 为什么JavaScript函数中的参数前面不能加var
首先这里是JavaScript的语法规则. 其次在调用function()函数的时候参数时外部传入的.在传入之前就已经被声明了.没必要在函数参数里声明. 如果想要在函数里用新的参数 function( ...
- JavaMail简单接收邮件
一个简单的例子,收取所有邮件并在控制台输出. package cn.jmail.test; import java.io.*; import java.util.*; import javax.mai ...
- PHP扩展开发之简单类开发
接下来我们要用扩展的形式实现以下类(演示环境:linux.php-5.5.34-src) <?php class Person { private $_name; public function ...
- vb的property 和event
Event 语句 定义用户自定义的事件. 语法 [Public] Event procedurename [(arglist)] Event 语句包含下面部分: 部分 描述 Public 可选的.指定 ...
- directive和controller如何通信
1.AngularJS是何方神圣 Angular JS (Angular.JS) 是一组用来开发Web页面的框架.模板以及数据绑定和丰富UI组件.它支持整个开发进程,提供web应用的架构,无需进行手工 ...
- php 支持递归函数.递归函数就是调用函数本身.
例子 将一个字符进行颠倒 function reverse_r($str){ if(strlen($str)){ reverse_r(substr($str,1));// } echo substr( ...
- LayoutInflater的获取方式
1.LayoutInflater是什么? 通俗而讲,就是将xml中定义的布局找出来. 2.获取LayoutInflater的三种方式 1. LayoutInflater inflater = ge ...