zoukankan      html  css  js  c++  java
  • android RefBase、sp、wp

    首先RefBase在android的c++部分是作为一个所有类的基类,其作用跟Java中的Object类似
    这个类中存在一个私有成员:
    weakref_impl* const mRefs;(weakref_impl是weakref_type的子类)
    这个mRefs是“影子对象”,是管理一个对象的引用计数的关键
    RefBase的构造中mRefs(new weakref_impl(this)),new一个weakref_impl对象,weakref_impl的构造形参是RefBase的指针
    同时会初始化weakref_impl的mStrongmWeak这两个成员,这两个就是关键的强引用计数和弱引用计数
    /********************RefBase的使用和原理其实很简单*****************************/
     
    接下来看看sp和wp(4.4及更高版本的源码中,sp不在RefBase中了,是放在StrongPointer的文件中)
    wp:
    template<typename T>
    wp<T>::wp(T* other)
        : m_ptr(other) //wp<A>中使用m_ptr指向实际的对象
    {
        if (other) m_refs = other->createWeak(this); //m_ref是一个RefBase中的weakref_type的对象,可以看出是将实际对象的影子对象加工处理之后再传给wp的成员的,也就是说wp握有一个实际对象的影子对象
    }
    wp是一个模板类,wp<A> wpA(pA);当然其构造函数有很多还可以用sp<A>来构造
     other->createWeak(this);会调到RefBase的createWeak,然后调用影子对象mRefs的增加弱引用计数
    wp的析构函数:
    template<typename T>
    wp<T>::~wp()
    {
        if (m_ptr) m_refs->decWeak(this);
    }
    在wp析构的过程中,回去调用实际对象的影子对象的弱引用自减,自减过后,弱引用会判断当前的引用计数,如果为0,则调用自身的析构,释放内存
     
    sp与wp类似
    但是sp内部仅有指向实际对象的指针的成员(但有指向实际对象的指针也能够找到影子对象)
    构造过程中会找到实际对象的影子对象,然后将影子对象的强引用和弱引用都自加
    然后值析构的过程中分两步走:
    1.首先减少影子对象的强引用计数,这时判断如果强引用计数为0的话则析构实际数据本身
    2.再减少影子对象的弱引用计数,然后但弱引用计数为0的话就将影子对象释放
     
    这种弱指针和强指针在android系统中起到的作用:就是用这个代替传统的指针,让代码中自行管理对象的内存释放,避免人工造成的内存泄露
    项目中用过
    pA = new A();
    sp<A> spA = pA;
    sp<A> spA(pA);
    这里就重载了等号操作符
    重载操作符是为了让这些操作符更加适用于更多的类类型
    template<typename T>
    sp<T>& sp<T>::operator = (T* other)
    {
        if (other) other->incStrong(this); //this的含义是类中函数的一个隐含参数,指向该类本身,这里就是指向sp<T>
        if (m_ptr) m_ptr->decStrong(this); //空构造mptr初始化0
        m_ptr = other;
        return *this;
    }
  • 相关阅读:
    CentOS 6 网络设置修改 指定IP地址 DNS 网关
    PowerDesigner连接MySQL,建立逆向工程图解
    PowerDesigner逆向工程导入MYSQL数据库总结
    《Spring Boot官方指南》(二)入门
    初识Spring Boot框架和快速入门
    MVC中html编码与否
    WPF背景透明内嵌WebBrowser不显示问题,即AllowsTransparency = true 和 Webbrowser 等控件显示冲突
    Forms.WebBrowser与Controls.WebBrowser区别
    一些不错的网站
    强制改变css样式优先级
  • 原文地址:https://www.cnblogs.com/ideawu1001/p/4288299.html
Copyright © 2011-2022 走看看