Android 内核初识(7)RefBase、LightRefBase、sp和wp
简介
RefBase是Android中所有对象的始祖,类似MFC中的CObject及Java中的Object对象。在Android中,RefBase结合sp和wp,实现了一套通过引用计数的方法来控制对象生命周期的机制。RefBase的子类在构造一个实际对象的同时,还会悄悄地构造一个影子对象.
sp是strong pointer,
wp是weak pointer,
LightRefBase是轻量级的引用计数类,只有一个引用计数,为0就删除.
RefBase,sp,wp中的引用计数
· RefBase中有一个隐含的影子对象,该影子对象内部有强弱引用计数。
· sp化后,强弱引用计数各增加1,sp析构后,强弱引用计数各减1。
· wp化后,弱引用计数增加1,wp析构后,弱引用计数减1。
· 由弱生强成功后,强弱引用计数均增加1。若一个wp弱引用计数为1,强引用计数为0,promote完成后,影子对象的强引用计数为1,弱引用计数为2。
何时删除对象
完全彻底地消灭RefBase对象,包括让实际对象和影子对象灭亡,这些都是由强弱引用计数控制的,另外还要考虑标志位mFlags的取值情况。
标志位的取值:
· 0,
· OBJECT_LIFETIME_WEAK= 0x0001,
· OBJECT_LIFETIME_FOREVER = 0x0003,
当标志位为0时,可得出如下结论:
· 强引用为0将导致实际对象被delete。
· 弱引用为0将导致影子对象被delete。
· flags为0,强引用计数控制实际对象的生命周期,弱引用计数控制影子对象的生命周期。强引用计数为0后,实际对象被delete。所以对于这种情况,应记住的是,使用wp时要由弱生强,以免收到segment fault信号。
· flags为LIFETIME_WEAK,强引用计数为0,弱引用计数不为0时,实际对象不会被delete。当弱引用计数减为0时,实际对象和影子对象会同时被delete。这是功德圆满的情况。
· flags为LIFETIME_FOREVER,对象将长生不老,彻底摆脱强弱引用计数的控制。所以你要在适当的时候杀死这些老妖精,免得她祸害“人间”。
注意
有几个函数在release版本中是空
addStrongRef,removeStrongRef,addWeakRef,removeWeakRef,printRefs,trackMe
Android 内核初识(7)RefBase、LightRefBase、sp和wp的更多相关文章
- android RefBase、sp、wp
首先RefBase在android的c++部分是作为一个所有类的基类,其作用跟Java中的Object类似 这个类中存在一个私有成员: weakref_impl* const mRefs;(weakr ...
- Android 内核初识(8)Binder
简介 Binder是Android系统提供的一种IPC(进程间通信)机制.由于Android是基于Linux内核的,因此,除了Binder外,还存在其他的IPC机制,例如管道和socket等.Bind ...
- Android 内核初识(5)Zygote进程
简介 Zygote本身是一个Native的应用程序,和驱动.内核等均无关系.Zygote是由init进程根据init.rc文件中的配置项而创建的. zygote最初的名字叫“app_process”, ...
- Android 内核初识(3)init进程
init是一个进程,确切地说,它是Linux系统中用户空间的第一个进程.由于Android是基于Linux内核的,所以init也是Android系统中用户空间的第一个进程,它的进程号是1.作为天字第一 ...
- 【转】Android 内核初识(6)SystemServer进程
简介 SystemServer的进程名实际上叫做“system_server”,通常简称为SS. 系统中的服务驻留在其中,常见的比如WindowManagerServer(Wms).ActivityM ...
- Android 内核初识(1)下载源码需求与教程
官方文档: http://source.android.com/source/requirements.html Requirements The Android build is routinel ...
- Android 内核初识(6)SystemServer进程
简介 SystemServer的进程名实际上叫做“system_server”,通常简称为SS. 系统中的服务驻留在其中,常见的比如WindowManagerServer(Wms).ActivityM ...
- Android 内核初识(4)属性服务器
简介 Windows平台上有一个叫注册表的东西.注册表可以存储一些类似key/value的键值对.一般而言,系统或某些应用程序会把自己的一些属性存储在注册表中,即使下次系统重启或应用程序重启,它还能够 ...
- Android 内核初识(2)android系统架构
以模块角度 以Java,native,kernel角度
随机推荐
- asp.net 中excel 导入数据库
protected void Button1_Click(object sender, EventArgs e) { SqlConnection conn = new SqlConnection(Sy ...
- myeclipse-8.6.0下载
myeclipse老版本不分32位和64位,欢迎大家下载使用! 链接:http://pan.baidu.com/s/1dEJCxcl 密码:z1ga
- Build Error 6041: Internal build error
Note: Following content is reprinted from the Original article Flexera : Build Error 6041. Only for ...
- Fire Net
Fire Net Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Subm ...
- OpenJudge 2980 大整数乘法
链接地址:http://bailian.openjudge.cn/practice/2980/ 题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 求两个不超过200位的非负整数的积 ...
- Boot Petalinux Project Using a remote system
通过jtag实现在远程服务器端下载petalinux image到连接在本地PC的开发板上的方法. 具体连接方式为 比如Host的系统为Windows,Remote system为运载在远程服务器上的 ...
- CENTOS7 使用网络管理器配置静态IP地址
CENTOS7 的网络配置和CENTOS6有些不同. 如果你想要使用网络管理器来管理该接口,你可以使用nmtui(网络管理器文本用户界面),它提供了在终端环境中配置配置网络管理器的方式. 在使用nmt ...
- PHPstrom 增加emmet插件
之前记得使用Eclipse的时候有一个插件叫 emmet 可以实现快速开发前端,简直就是前端开发秒杀神器: 输入对应的代码一个table键就搞定了一堆代码: 在emmet的官网上 看到其实是支持的PH ...
- Raphael:JS矢量图形库
Raphael:JS矢量图形库 2016-08-29 http://dmitrybaranovskiy.github.io/raphael/
- linux共享文件samba安装与java读取外部文件夹方法
测试环境RedHat 6.4 一.安装 samba组件安装: (1)首先用“rpm –qa |grep samba”命令检验系统samba服务是否安装. #rpm –qa |grep samba sa ...