Android中定义了两种智能指针类型,一种是强指针sp(strong pointer),另外一种是弱指针(weak pointer)。其实称之为强引用和弱引用更合适一些。强指针与一般意义的智能指针概念相同,通过引用计数来记录有多少使用者在使用一个对象,如果所有使用者都放弃了对该对象的引用,则该对象将被自动销毁。

弱指针也指向一个对象,但是弱指针仅仅记录该对象的地址,不能通过弱指针来访问该对象,也就是说不能通过弱智真来调用对象的成员函数或访问对象的成员变量。要想访问弱指针所指向的对象,需首先通过wp类所提供的promote()方法将弱指针升级为强指针。弱指针所指向的对象是有可能在其它地方被销毁的,如果对象已经被销毁,wp的promote()方法将返回空指针,这样就能避免出现地址访问错的情况。

弱指针是怎么做到这一点的呢?其实说白了一点也不复杂,原因就在于每一个可以被智能指针引用的对象都同时被附加了另外一个weakref_impl类型的对象,这个对象中负责记录对象的强指针引用计数和弱指针引用计数。这个对象是智能指针的实现内部使用的,智能指针的使用者看不到这个对象。弱指针操作的就是这个对象,只有当强引用计数和弱引用计数都为0时,这个对象才会被销毁。

说了这么多原理,下面该看看智能指针该如何使用了。假设现在有一个类MyClass,如果要使用智能指针来引用这个类的对象,那么这个类需满足下列两个前提条件:

1:这个类是基类RefBase的子类或间接子类;

2:这个类必须定义虚构造函数,即它的构造函数需要这样定义:

【1】virtual ~MyClass();

满足了上述条件的类就可以定义为Android智能指针了,定义方法和普通指针类似。比如普通指针是这样定义:

MyClass* p_obj;

智能指针是这样定义:

【2】sp<MyClass> p_obj; //定义智能指针

注意不要定义成sp<MyClass>* p_obj。这是初学者很容易犯的错误,这样其实相当于定义了一个指针的指针。尽管在语法上没有问题,但是最好不要这样定义。

【3】定义了一个智能指针的变量,就可以象普通指针那样使用它,包括赋值、访问对象成员、作为函数的返回值、作为函数的参数等。比如:

p_obj = new MyClass(); // 注意不要写成 p_obj = new sp<MyClass> ;定义一个智能指针,其实是一个对象,这时可以指向这个类new出来的对象
  sp<MyClass> p_obj2 = p_obj;//可以随意赋值
  p_obj->func();//调用对象成员函数
  p_obj = create_obj();
  some_func(p_obj);

注意不要试图delete一个智能指针,即 delete p_obj。不要担心对象的销毁问题,智能指针的最大作用就是自动销毁不再使用的对象。

不需要再使用一个对象后,直接将指针赋值为NULL即可:

p_obj = NULL;

3、弱指针

上面说的都是强指针,弱指针的定义方法和强指针类似,但是不能通过弱指针来访问对象的成员。下面是弱指针的示例:

wp<MyClass> wp_obj = new MyClass();
p_obj = wp_obj.promote(); // 升级为强指针。不过这里要用.而不是->,真是有负其指针之名啊(注意:p_obj已定义为强指针)

wp_obj = NULL;

Android智能指针用起来是很方便,在一般情况下最好使用智能指针来代替普通指针。但是需要知道一个智能指针其实是一个对象,而不是一个真正的指针,因此其运行效率是比不上普通指针的。所以在追求高效率运行的地方最好还是使用普通指针为好。

Android基础知识之智能指针:强指针和弱指针相关推荐

  1. android基础知识

    技术型男 随笔 - 20, 文章 - 0, 评论 - 4, 引用 - 0 android基础知识 1. 前言 1.1. 什么是3G.4G Ÿ 第三代移动通信技术(3rd - Generation),速 ...

  2. Android基础知识~入门进阶,一步步走到高手

    Android基础知识~入门进阶,一步步走到高手 2011年09月01日 [b]希望新入手ANDROID设备的朋友认真阅读本帖,一些简单的问题就可以自己解决了!!! 一:基础知识[/b] [b]1.什 ...

  3. Android基础知识:在UI线程中运行代码

    本文翻译自:Android basics: running code in the UI thread In the viewpoint of running code in the UI threa ...

  4. 100天精通Andriod逆向——第2天:Android基础知识和jadx的使用

    目录 一.Android基础知识介绍 1.1 Android 历史版本 1.2 apk 包文件结构 1.3 Android系统目录介绍 二.jadx的使用 2.1 jadx 的简介 2.2 jadx ...

  5. Android基础知识(二十):Notification、提醒式通知(横幅)踩坑与通知界面设置跳转

    Android基础知识(二十):Notification.提醒式通知(横幅)踩坑与通知界面设置跳转 一.Notification通知与基本用法 通知Notification是Android系统中比较有 ...

  6. Android基础知识【项目实训-实现二级导航“今日活动”及读取数据库】【5】

    [该项目实训是Android基础知识的一个综合练习,特别提示:项目中会用到一些图片素材,都是随意整理的,稍后会上传一个资源,包含该事项项目的基本功能,也含有图片素材] [项目题目]:校园订餐App设计 ...

  7. Android 基础知识+app测试权限问题

    Android 基础知识(权限篇)** 前言 ​ Android是一个开源的,基于Linux的移动设备操作系统,主要用于移动设备,如智能手机和平板电脑.Android是由谷歌及其他公司带领的开放手机联 ...

  8. Android基础知识——完善

    首页 下载App × Android基础知识--完善 布鲁马 2016.05.17 10:29* 字数 5478 阅读 2672评论 1喜欢 38 疯狂Android摘要,Android基础知识好乱好 ...

  9. Android基础知识(二十一):Android五大存储之文件存储、Content Provider存储和网络存储

    Android基础知识(二十一):Android五大存储之文件存储.Content Provider存储和网络存储 一.Android存储--持久化技术 数据持久化是指将那些内存中的瞬时数据保存到存储 ...

最新文章

  1. Postgres中的物化节点之sort节点
  2. 在华为写了 13 年代码,都是宝贵的经验
  3. win32程序测试键盘钩子
  4. 由于未分配内存的指针导致段错误
  5. 地线与接地螺丝_电气接地规范与接地的各项参数
  6. MySQL datediff()函数
  7. android 9.0 https 适配,如何适配 Android 9.0? 在 Android 9.0 上发生 SSL handshake timed out 异常怎么解决...
  8. 关于nginx,你不可不知的几大特色功能
  9. git push 报错:you are not allowed to upload merges
  10. win10开移动热点让手机使用上网
  11. 交叉编译iptables1.4.12的问题
  12. partition by 和 group by
  13. apollo-配置管理中心-安装
  14. 【 javascript 】.innerHTML属性定义
  15. TSC打印机标签纸出纸位置调整方法
  16. 大神TP_萌新到大神的必修课---分路篇v
  17. 大数据如何改变我们的国庆假期?
  18. 知云软件登陆但不显示登陆二维码
  19. 各种友(e)善(xin)数论总集(未完待续),从入门到绝望
  20. python读写文件is和==区别常用模块

热门文章

  1. 你还在烦U盘记录该如何消除吗
  2. Win2008 R2 RemoteApp深度体验之二,RemoteApp服务器配置
  3. TML5 App 开发框架收集
  4. 从xml数据集到FairMOT数据集转换
  5. Vue学习笔记之09-v-model双向绑定
  6. 二元函数可导与可微的关系_视频教学:期末试卷解析之多元函数基本概念及相互关系讨论...
  7. asp.net+sql数据库学生信息管理系统
  8. AngularJS 之 ng-model
  9. 软件工程-团队作业3
  10. 简单记录一次ORA-00600 kcratr_nab_less_than_odr