java dec inc_Android系统篇之----Android中的智能指针

原标题:Android系统篇之----Android中的智能指针

一、前言

今天我们开启系统篇的文章了,其实一直想弄,只是之前一直没有太多深入的了解,最近又把这块拿出来好好看了一下,所以想从新梳理一下,来看看Android中的这块知识,首先我们今天来看一下:Android中的智能指针的概念,为什么说先看一下智能指针这个知识呢?因为我们在看Android源码的时候,会发现几乎好多地方都用到了这个东东,所以我们在介绍后面的知识点,先来看看这个吧。

二、问题

那么Android中的智能指针是个什么东西呢?我们知道Android用的语言开发的,Java语言是没有指针这个概念的,当然Java有JNI技术,C/C++有指针的概念的,那么为什么叫做智能呢?智能指针到底是不是真的指针,如何做到智能,我们带着疑惑去看看这些问题。

其实Android中的智能指针是对C++中的对象回收机制的封装,我们知道C++中的构造函数和析构函数是在对象new出来和delete的时候调用的,但是一个在销毁一个对象的时候,我们需要手动的调用delete关键字来销毁,但是在Java中我们无需在乎这些对象的销毁工作,都是由垃圾回收器来做了,所以在Android系统层,为了达到Java的这个自动管理对象的效果,就出现了智能指针的概念了,他的出现类似于Java中的回收器,或者是OC中的自动释放池的功能等,他内部实现也很简单,就是用两个变量来控制,一个是强引用计数变量,一个是弱引用计数变量,这两个变量都是int类型的,表示一个对象被引用多少次,两个变量会依据具体的生命管理周期模式来决定是否释放对象。

三、源码解读

Android中的智能指针的主要代码是:RefBase.h和RefBase.cpp这两个文件,他们分别位于:

RefBase.h:Android源码目录\frameworks\native\include\utils\RefBase.h

RefBase.cpp:Android源码目录\frameworks\native\libs\utils\RefBase.cpp

我们在RefBase.h中可以看到智能指针的定义。智能指针分为两种,一个是sp,一个是wp,顾名思义,sp=strong pointer

wp=weak pointer,他们两各有用途,后面会详细介绍,首先来看一下他们的定义:

46282b6e9b34f9a29deb80e968f7d6ee.png

我们看到这个使用到了C++中的模板技术来定义的,关于模板大家如果不熟悉的话,可以认为是Java中的泛型机制,简化代码,增加通用性和安全性的。

从定义来看,我们知道sp和wp其实是一个类,并非真正意义上的指针,这就解决了我们的第一个困惑,智能指针不是真正意义上的指针。

我们看到sp和wp类中都有一个RefBase类型的变量,那么我们在看看RefBase是个什么东东:

4011545190beaf5dac1cdc6d208971f1.png

这里我们看到,本身RefBase有两个方法:incStrong和decStrong,这个一看应该就知道这两个方法就是用来操作强指针的,在RefBase内部定义了weakref_type类,这个类有两个方法:incWeak和decWeak,这个一看应该就知道这两个方法就是用来操作弱指针的。我们在去RefBase.cpp内部看看:

f55d6bd7e4cc8c9eab6be9c1c20ac061.png

RefBase内部的一个weakref_impl内部类,继承weakref_type类,他内部有四个变量:

1、mStrong:是记录强指针的引用计数

2、mWeak:是记录弱指针的引用计数

3、mBase:是RefBase类型的变量

4、mFlags:智能指针采用什么样的生命管理周期,默认是0,就是采用强生命周期来管理对象。

接着看到weakref_impl的初始化,看到:

mStrong变量初始化的值是:0x10000000

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值