[深入分析BREW机制]:BREW接口的引用计数机制

Mac M2上brew install报错与超时问题全解析:从No remote ‘origin‘到国内镜像优化 本文详细解析了Mac M2芯片上使用Homebrew时常见的'No remote 'origin''报错与超时问题,提供了从Git安全配置到国内镜像优化的完整解决方案。针对M2的ARM架构特性,特别介绍了如何强制使用bottle安装、处理依赖冲突等进阶技巧,帮助开发者高效管理软件包。 阅读详情

 BREW接口的引用计数机制
 ——目录——
 引言
 1、new函数规则一
 2、new函数规则二
 3、AddRef函数规则
 4、Release函数规则
 5、接口指针作为函数入参规则一
 6、接口指针作为函数入参规则二
 7、接口指针获取规则
 结语

引言
所有BREW接口的实现结构体里都有一个成员uint32 m_nRef,这就是常说的引用计数值,而引用计数机制就是通过管理m_nRef来管理接口的生命期,接口的生命期就是接口在内存中所呆的时间。
BREW的引用计数机制是符合com规范的,或者说按照com规范来理解和使用BREW的引用计数机制是安全的。
针对BREW的具体应用环境,我总结出如下几条使用规则:
1、new函数规则一
在new函数里将接口本身的数据成员m_nRef初始化为1。
(我把接口现实里的创建接口的函数称为new函数,因为它的函数名中习惯上都会带有new字样,new函数在AEEClsCreateInstance函数里被调用,赋有分配接口实例的内存和初始化接口实例的数据的功能。)
2、new函数规则二
除了m_nRef是接口的必备数据成员外,m_pIShell和m_pIModule也应成为必备。m_pIShell、m_pIModule由new函数接收AEEClsCreateInstance函数的对应入参(IShell *)、(IModule *)来赋值。除了赋值之外,new函数还应调用IShell和IModule接口的AddRef函数:
IShell_AddRef(pme->m_pIShell);
IModule_AddRef(pme->m_pIModule);
3、AddRef函数规则
AddRef的作用就是将接口自身的m_nRef加1,然后将m_nRef作为返回值。
4、Release函数规则
Release函数的作用与AddRef相反,将m_nRef减1,如果减完之后,m_nRef的值等于0,则要释放接口实例所占内存,千万忘的一点是如果实例结构体里有指针成员,则要先释放这些指针成员所指向的内存,比如,在new函数里调用了m_pIShell和m_pIModule的AddRef函数,在这里就要调用它们的Release函数。像m_pIShell属于全局性的成员,生命期与接口实例同,在接口的整个生命期中,供给接口的各个接口函数使用。
5、接口指针作为函数入参规则一
如果能确定函数A都是在其它函数的内部被调用,这种情况下,A的生命期一般都嵌套在调用者的生命期里。如果A使用了接口指针入参,那么在函数A的开头和结尾都不需要调用此接口指针的AddRef和Release函数,也就是说直接使用就行了,不必担心接口指针的分配与释放问题。
6、接口指针作为函数入参规则二
如果函数A属于回调函数供回调使用,这种情况下,A的生命期与调用者的生命期是异步的,如果函数A的参数中有接口指针入参,为了保证A在使用这个调用者传入的接口指针时,此接口指针还是有效的,就需要调用者只创建和传入此接口指针而不用释放。这样函数A的工作就是在使用接口指针前不要调用AddRef,但在使用完之后一定要调用此接口指针的Release函数。
7、接口指针获取规则
获取一个接口指针IImageCtl *pa的方法有三种:1)直接创建,IShell_CreateInstance(....&pa); 2)通过函数B的返回值或输出参数得到,3)直接将另一个IImageCtl *pb赋给它,即pa = pb形式。对于第1)、2)种获取方法,不需调用pa的AddRef函数,但要在使用完后调用Release函数;对于第3)种获取方法,原则上要调用pa的AddRef,并且在使用完后要调用pa的Release,但实际上往往可以省去这一对调用。具体为:如果pa的生命期嵌套在pb的生命期里,则可省,典型的例子是:pa是函数的入参,调用者将pb传给此入参,而pb的释放在被调函数返回之后进行,实际就是规则5。如果pa是一个全局性的变量,比如一个applet结构体的成员、一个接口结构体的成员,赋值一次要供applet或接口的所有函数使用,这时pa被赋值之后要调用AddRef,而Release要在applet的free函数或接口的release函数里调用。如果pa的生命期与pb是异步的,则也要调用,实际上规则6说的就是这种情况。

结语
引用计数看似很深奥,其实大多数情况下不必太关注,除了上面的规则之外,要记住下面几个原则会让你省去很多麻烦:1)看见CreateInstance,别忘Release;2)少用AddRef,用了AddRef,也别忘Release;3)AddRef和Release的返回值不要用;
最后具个例子帮你应用上面的规则:BREW的有些接口指针的获取不是直接调用CreateInstance,而是通过别的接口函数来得到,如IDatabase指针、IIFile指针、IImage指针等等,获取这些接口指针后,不必调用它们的AddRef函数,但是在使用完之后仍要调用它们的Release函数,这属于规则7里所说的第三者2)种获取接口指针的方法。

深入理解Brew播放器源码及音频处理技术 本文还有配套的精品资源,点击获取 简介:Brew播放器是一个专为BREW平台设计的音频播放软件,其源码对于学习BREW应用开发至关重要。本文详尽解读了Brew播放器源码的核心概念、关键技术及实现原理,包括音频解码、内存管理、音频流控制、用户界面设计、事件处理和电源管理。通过深入分析Brew播放器源码,开发者可以掌握在BREW平台上进行音频处理、用户界面设计和事件处理等多方面... 阅读详情

相关推荐

ABAP代码检查(Code Review)

1、SLIN 扩展程序检查 也可通过(SE38工具栏->检查-扩展程序检查) 进入 2、ATC 检查 通过<SE38菜单栏-检查-ABAP测试主控室> 或事物代码SCI, 支持自定义检查变式 SCI可以配置检查变式满足特殊需求,配置对象集用于批量检查 3、通过ABAP测试主控室实现统一管理,定期检查作业和监控功能(事务代码ATC) 参考 SLIN...

u012232542的博客 6069

引用计数和AddRef、Release

          AddRef和Release实现的是一种名为引用计数的内存管理技术,这种技术是使组件能够自己将自己删除的最简单同时也是效率最高的方法。COM组件将维护一个称作是引用计数的数值。当客户虫组件取得一个接口时,此数值增1,当客户使用完某个接口后,此数值将减1。当此数值为0时,组件即可将自己从内存中删除。为正确的使用引用计数,需要了解一下三条规则:(1)       在返回之前

3651

【学习笔记】计算机网络 第八章 无线局域网(WLAN)

计算机网络 第八章 无线局域网(WLAN)

Vera_shsf的博客 1244

COM组件的AddRef和Release()方法使用

AddRef和Release实现的是一种名为引用计数的内存管理技术,这种技术是使组件能够自己将自己删除的最简单同时也是效率最高的方法。COM组件将维护一个称作是引用计数的数值。当客户虫组件取得一个接口时,此数值增1,当客户使用完某个接口后,此数值将减1。当此数值为0时,组件即可将自己从内存中删除。   为正确的使用引用计数,需要了解一下三条规则:   (1)在返回之前调用AddRef。对于哪些

yangshuangtao的专栏 6001

iPhone用户必看:TrollStore巨魔商店在线安装保姆级教程(iOS 14-16.6.1适用)

本文为iOS 14至16.6.1系统的iPhone用户提供了一份详细的TrollStore(巨魔商店)在线安装教程。文章从核心原理、安装前准备讲起,逐步详解了通过Safari浏览器获取安装器、信任企业证书、部署TrollStore及关键后置配置的全过程,并附带了常见问题排错指南,帮助用户安全、高效地实现无需越狱安装第三方应用。

h0i1j2k3l的博客 2002

使用PlotNeuralNet绘制深度学习网络图的基本操作

使用PlotNeuralNet绘制深度学习网络图的基本操作

weixin_46877907的博客 2112

MySql中insert,group by,order by语句优化

我们在MySql中经常进行数据的增删改查操作,这里和大家一起分享一些常用的sql优化技巧。 首先我们来说一下ORDER BY的优化。 ORDER BY 是我们在sql中进行排序的语句,首先我们使用ORDER BY 语句的时候,如果可以按照有序索引顺序扫描来返回有序数据的话,那么这种方式是最快的,比如说我们有一张表A,其主键为ID,ID自增,并且存在主键索引,那么我们进行如下查询:select

千林的博客 1878

使用qt+PaddleOCR做一个OCR软件demo

文章目录使用qt+PaddleOCR做一个OCR软件demo效果展示1 建立环境1.1 vs项目环境1.2 qtcreator项目环境1.2.1 源代码整理1.2.2 依赖项整理如下1.2.3 模型文件如下1.2.4 在.pro文件中设置依赖库的模式1.2.5 pro文件中添加.h和.lib2 在工程代码中添加截图功能2.1 新建截图类并连接信号2.2 QImage转cv::Mat3 在工程代码中集成PaddleOCR3.1 初始化PaddleOCR3.2 修改文字识别类的run函数,增加一个返回结果的值的

ShareProgress的博客 9306

[深入分析BREW机制]:动手写BREW扩展接口

动手写BREW扩展接口 ——目录—— 引言 1、写扩展接口最好要熟悉的几个宏 2、示例接口IStringParse 3、接口解析  3.1 头文件解析  3.2 .c文件解析  3.3接口实例的创建  3.4接口的实现函数  3.5接口的释放 结语引言 扩展接口在BREW开发中很重要,使你的程序更健壮,维护工作更高效。一个程序应尽力将业务处理分离成功能类接口,这使得业务的实现和维护,与对业务的

chinesecoolman的专栏 1918

线性自抗扰控制(LADRC)系统算法框图

NLADRC自抗扰控制从Simulink仿真到PLC控制实现_自抗扰控制器 simulink仿真-优快云博客本文介绍了如何将ADRC自抗扰控制算法从Simulink仿真应用到PLC控制中,包括Simulink框图、TD微分器模型、MATLAB函数的使用、SCL控制代码,以及非线性状态误差反馈控制率的实现。提供了详细的MATLAB仿真步骤和PLC源代码链接。ADRC自抗扰控制算法(含梯形图完整源代码和算法公式)_adrc算法-优快云博客。

RXXW_Dor的博客 1464

PCL 计算点云包围球【2025最新版】

包围球通常用于简单排斥,因为与球体相交的方程很简单,同样重要的是,旋转一个球体并不会改变其范围。因此,当包围球用于简单排斥时,如果球体中心是对象的原点,则可以忽略对象的方向。

点云侠的博客 2068

[深入分析BREW机制]:BREW的类机制

 BREW的类机制 ——目录—— 引言 1、BREW类声明透析 2、BREW类实现透析 3、BREW类的创建过程 结语引言 Brew开发包由两部分组成:标准接口、助手函数。我们可以利用brew sdk开发第三方应用,也可以开发新的接口,第三方接口称为扩展接口(extension interface). 所有的标准接口、扩展接口以及brew应用的实现机制都是一样的,我称之为Brew类机制,所有的

chinesecoolman的专栏 1494

[深入分析BREW机制]:BREW接口的继承特性应用

 BREW接口的继承特性应用 ——目录—— 引言 1、接口继承 2、实现继承 结语引言 这里所说的BREW接口的继承特性,也就是BREW类的继承特性。一个BREW接口包括两部分,第一部分是接口的定义和接口函数宏的定义;第二部分是接口函数的实现。我往往把第一部分直接称为接口,所以“接口”二字有时表示的是一个独立完整的接口,有时指的是完整接口的第一部分。 从BREWapi里提供的接口来看,用到了两

chinesecoolman的专栏 1107

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

[深入分析BREW机制]:Mod相关概念解析

 BREW MOD相关概念解析 目录 1、Mod与Applet、接口的关系 2、Mod的唯一标识 3、Applet、接口的唯一标识 4、Mod的实体组成 5、Mod的加载和启动  5.1 加载Mod  5.2 启动Mod 6、在simulator中运行动态Mod1、Mod与Applet、接口的关系本文之前谈到的都是Applet和接口,实际上BREW的运行单元是Mod,而Applet、接口只是M

chinesecoolman的专栏 2199

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

[深入分析BREW机制]:applet的类特征

BREW applet的类特征 ——目录—— 引言 1、appgun创建过程简述 2、appgun为什么是一个类 3、appgun的类实例结构体解析 结语引言本篇创建一个applet,applet的名字叫gun,简称appgun。通过分析appgun的创建过程来揭示appgun的类本质。1、appgun创建过程简述1)首先定义一个Cappgun结构体,里面定义appgun的所有数据成员:t

chinesecoolman的专栏 973

BREW平台主要技术的分析与总结

2003年,美国高通公司在中国推出了BREW平台,在中国获得了快速的发展和应用。时间虽然不短,但是由于高通公司的种种约束以及BREW平台本身的诸多限制,使得许多开发人员对在BREW平台下进行开发不得要领。本文深入分析了BREW平台的主要技术以及实现机制,包括模块加载机制、事件处理机制、接口机制和回调机制,以期对BREW平台有深入透彻的理解,并对BREW的主要技术进行了总结。 (此文为毕设时写的小论文,谈不上原创,但还是有一定参考价值。)

feng_zai的专栏 1735

[转]深入BREW消息处理机制

 消息处理机制,即event driven和传统的编程机制不同,如dos,unix下的c编程,他没有main loop,程序的流程不是顺序执行的。有过window编程经历的读者都会清楚这种机制。Windows下消息处理机制:当在交互中进行一个action(or signal, or input, etc),window产生相应的event,通过window的event dispatch机制,相应的

chenyonghua521的专栏 304

BREW & J2ME:在差别中联合

[出自: http://expert.imobile.com.cn]摘要 本系列面向那些习惯使用J2ME的手机开发者,或者那些对更轻便和更有效的代码生成感兴趣的BREW开发者。主要是受Java GUI模型的启发,当前的BREW_J2ME 框架可以处理J2ME中当作“高级别接口”的东西。关于如何提供确切的J2ME匹配-推理不在本文讨论范围之内,本文只是提供这两个领域的概述。 首先我将快速讨论BR

mobilechannel的专栏 5674

android viedio控件,基于brew平台的手机播放器应用的设计与实现-电子与通信工程专业论文.docx...

基于brew平台的手机播放器应用的设计与实现-电子与通信工程专业论文西安电子科技大学硕士学位论文基于BREW平台的手机播放器应用的设计与实现姓名:韩宏娜申请学位级别:硕士专业:电子与通信工程指导教师:任光亮;李涛201112摘要播放器应用是手机上的重要娱乐模块,目前已经成为手机中的必备应用之一。摘要播放器应用是手机上的重要娱乐模块,目前已经成为手机中的必备应用之一。 传统的基于BREW平台手机应用...

weixin_31924507的博客 439

在BREW程序中调用另一个mod的分析

 近日读到这样一段程序。可以在程序运行时调用另一个mod文件并执行。这样可以做到应用自升级,压缩程序文件等实用的功能。  要想理解这点,先看一下正常的BREW程序加载过程。 BREW程序的入口,即相当于c程序的main,是位于AEEModGen.c中的AEEMod_Load函数。这可以从mak文件的连接选项中看出来。 LINK_ORDER = -first AEEMod_Loa

435

Bluefin工具箱中brew安装失败问题的分析与解决方案

Bluefin工具箱中brew安装失败问题的分析与解决方案 问题现象 在使用Bluefin工具箱的bluefin-cli容器时,用户尝试通过Homebrew安装软件包时遇到错误。典型错误信息显示为"cp: No such file or directory (os error 2)",表明在文件复制过程中出现了问题。这个问题自2024年7月首次报告以来,持续影响了多个用户的使用...

gitblog_07802的博客 355
上一篇: [深入分析BREW机制]:BREW接口的继承特性应用
下一篇: [深入分析BREW机制]:Mod相关概念解析
chinesecoolman
博客等级 码龄18年 6粉丝 22原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值