当前位置: 首页 > wzjs >正文

少儿编程十大培训机构重庆seo技术分享

少儿编程十大培训机构,重庆seo技术分享,宁波seo推荐运营培训,web前端开发招聘简章在 Android 系统中&#xff0c;强指针模板类&#xff08;sp<T>&#xff09; 是一种基于引用计数的智能指针实现&#xff0c;专门用于管理对象的生命周期。它被广泛用于 Android Framework 的底层&#xff08;Native 层/C 代码&#xff09;&#xff0c;尤其是与 Binder 通…

在 Android 系统中,强指针模板类(sp<T> 是一种基于引用计数的智能指针实现,专门用于管理对象的生命周期。它被广泛用于 Android Framework 的底层(Native 层/C++ 代码),尤其是与 Binder 通信相关的模块。

1. sp<T> 的定义与作用

  • 模板类sp<T> 是一个模板类(定义在 <utils/StrongPointer.h> 中),通过泛型支持任意类型的对象。
  • 强引用语义:通过引用计数(Reference Counting)跟踪对象的使用情况,确保对象在不再被任何指针引用时自动释放内存。
  • 设计目标:解决 Android 系统中 Native 层对象生命周期管理的复杂性,避免内存泄漏和野指针问题。

2. 强指针服务对象

引用计数机制
  • 每个被 sp<T> 管理的对象必须继承自 RefBase(定义在 <utils/RefBase.h>)。
  • RefBase 提供了两个引用计数器:
    • 强引用计数(Strong Count):由 sp<T> 管理,归零时对象被销毁。
    • 弱引用计数(Weak Count):由 wp<T>(弱指针)管理,归零时对象的控制块被释放(但对象内存可能已被强引用释放)。
sp<T> 的实现原理
  1. 构造 sp<T>
    sp<T> 指向一个对象时,会调用 RefBase::incStrong() 增加强引用计数。

    template<typename T>
    sp<T>::sp(T* other) : m_ptr(other) {if (other) other->incStrong(this);
    }
    
  2. 析构 sp<T>
    sp<T> 超出作用域或被重置时,调用 RefBase::decStrong() 减少强引用计数。若计数归零,销毁对象。

    template<typename T>
    sp<T>::~sp() {if (m_ptr) m_ptr->decStrong(this);
    }
    
  3. 赋值与拷贝
    拷贝或赋值操作会调整引用计数,确保新旧指针的正确管理:

    sp<ProcessState> p1 = new ProcessState(); // 强引用计数=1
    sp<ProcessState> p2 = p1;                 // 强引用计数=2
    

3. sp<T>RefBase 的关系

  • 对象必须继承 RefBase
    只有继承自 RefBase 的类才能被 sp<T> 管理。例如:

    class ProcessState : public virtual RefBase {// ...
    };
    
  • RefBase 的关键方法

    • incStrong():增加强引用计数。
    • decStrong():减少强引用计数,可能触发对象销毁。
    • onFirstRef():当强引用计数从 0 变为 1 时调用(首次被引用)。
    • onLastStrongRef():当强引用计数归零时调用(即将销毁)。

4. 使用场景示例

示例 1:Binder 代理对象的生命周期管理

在 Binder 通信中,客户端通过 sp<IBinder> 持有服务端的代理对象:

// 获取 ServiceManager 的代理
sp<IServiceManager> sm = defaultServiceManager();// 获取 BatteryService 的 Binder 代理对象
sp<IBinder> binder = sm->getService(String16("battery"));// 将 IBinder 转换为具体的服务接口
sp<IBatteryService> batteryService = interface_cast<IBatteryService>(binder);
  • sp<T> 确保代理对象在不再被使用时自动释放。
示例 2:单例模式的资源管理

ProcessState 单例中,使用 sp<T> 确保全局唯一实例的正确释放:

sp<ProcessState> ProcessState::self() {static sp<ProcessState> gProcess(new ProcessState);return gProcess;
}

5. sp<T> vs C++ 标准智能指针

特性sp<T> (Android)std::shared_ptr<T> (C++11)
依赖对象基类必须继承 RefBase无要求(通过 std::enable_shared_from_this 可选)
性能优化为嵌入式系统优化,轻量级通用实现,可能略重
线程安全引用计数操作是原子的(线程安全)默认线程安全(依赖实现)
弱指针支持通过 wp<T> 实现通过 std::weak_ptr<T> 实现
内存开销每个对象附带 RefBase 的控制块每个 shared_ptr 有单独的控制块

6. 注意事项

  1. 循环引用
    sp<T> 无法自动处理循环引用(如对象 A 持有 sp<B>,对象 B 持有 sp<A>),需结合 wp<T>(弱指针)打破循环。

  2. 继承 RefBase
    若类未继承 RefBase,使用 sp<T> 会导致编译错误。

  3. 跨模块传递
    确保对象的所有权通过 sp<T> 明确传递,避免裸指针(T*)脱离智能指针管理。

  4. 线程安全
    虽然 sp<T> 的引用计数操作是原子的,但对象本身的线程安全性需开发者自行保证。

http://www.dtcms.com/wzjs/380240.html

相关文章:

  • 哈尔滨网站专业制作郑州百度推广代运营
  • wordpress个人站推广普通话奋进新征程
  • 怎么判断网站的好坏河南网站网络营销推广
  • 做旅游网站毕设任务书广告公司
  • 网站开发 python网站推广的技巧
  • 2013影响网站百度搜索排名的关键因素统计重庆seo招聘
  • 深圳中小企业网站制作武汉seo公司哪家专业
  • 北京建设银行官网招聘网站烟台seo
  • 小米商城网站建设分析网络营销策划书1000字
  • 广州专业手机网站建设湖南关键词优化首选
  • .jsp网站开发技术搜索引擎网站提交入口
  • 南京做网站哪家最好提高seo排名
  • ui设计技能就业培训百度推广优化排名
  • 龙岩融胤网络科技有限公司关键词优化需要从哪些方面开展
  • 怎么做考试资料分享网站seo优化外包公司
  • 营销网络怎么填写厦门seo优化推广
  • 北京网站建设公司降龙工具站seo
  • 胖哥食品网站建设规范意见济南百度竞价代运营
  • 德州做网站的公司百度图片识别搜索引擎
  • 有什么专门做电子琴音乐的网站互联网推广引流是做什么的
  • 免费ppt模板下载应用网站关键词seo排名
  • 做违法网站程序员犯法吗yandex搜索引擎
  • 淘宝属于什么类型的网站自己如何做一个网站
  • 做旅游网站毕设任务书教育培训网页设计
  • 俄文网站开发地点网站seo优化工具
  • 阳泉建设公司网站企业网站
  • 高阳县做企业网站什么叫百度竞价推广
  • 天津大型网站建设郑州网站优化渠道
  • 广东专业网站建设报价seo整站网站推广优化排名
  • 双语网站管理系统 div css一键优化表格