当前位置:网站首页>浅解ARC中的 __bridge、__bridge_retained和__bridge_transfer
浅解ARC中的 __bridge、__bridge_retained和__bridge_transfer
2022-07-07 20:58:00 【全栈程序员站长】
大家好,又见面了,我是全栈君。
文章来源:http://www.outflush.com/2015/03/introduction-of-arc-bridge-type-transfer/
在对 bridge 相关的修饰符解说前。首先了解下面内容
- Core Foundation 是一组C语言接口。它与Foundation为相同功能提供接口。仅仅是Foundation框架提供的是Objective-C接口。
- Core Foundation中的对象也存在引用计数的概念,相似于Foundation的retain/release,其相应的接口是CFRetain/CFRelease
- 这两个框架的对象之间能够相互转换,这样的转换被称之为Toll-Free bridge
- 当使用ARC时,Core Foundation中的对象不被ARC所管理。所以Core Foundation和Foundation中的对象在相互转换的过程中会涉及到对象全部权的转换。这里便用到了bridge修饰符。
普通对象与C语言指针之间的转换
void *p = NULL;
{
id obj = [[NSObject alloc] init];
p = (__bridge void *)obj;
}
NSLog(@"Hello");
// 这里会出现错误
NSLog(@"%@", [(__bridge id)p class]);上面代码中的obj被ARC管理,p是一个C语言指针。不在ARC的管理范围中。当程序运行到obj的作用域之外。ARC便将obj给release掉,这时p指针成为NULL。所以在使用__bridge的时候必须清楚对象的生命周期否则便会出现相似上面的错误。
这时便应该使用__bridge_retain关键字来进行转换
p = (__bridge_retain void *)obj;
// 上面这段代码在非ARC的环境下能够表示为
p = obj;
[(id)p retain];所以当obj被ARC release后,p指针仍然指向一个有效的对象。
而__bridge_transfer则是用于将一个通过__bridge_retain转换得到的C语言指针又一次转换为被ARC管理的普通对象。
id obj = (__bridge_transfer id)p;
// 用非ARC来表示就是
id obj = p;
[obj retain];
[(id)p release];能够看出,__bridge_transfer将p指向的对象的全部权转移到了ARC管理的obj上。
当在ARC环境中声明 id obj 时。默认是 strong 修饰符修饰的,所以ARC会自己主动对obj进行retain处理。所以说 __bridge_transfer仅仅做了release处理。
Core Foundation与Foundation普通对象之间的转换
从上面已经知道Core Foundation中的对象也存在引用计数的概念。当在非ARC环境下,Core Foundation对象和Foundation对象能够通过标准的C语言类型转换来进行转换(Toll-Free bridge)。而当引入ARC后则须要bridge来进行转换,由于你须要明白的告诉编译器怎样处理对象的全部权。
比如:
NSString *str = [NSString stringWithFormat…];
CFStringRef cfStr = (__bridge CFStringRef)str;
...
CFRelease(cfStr);这里str对象被ARC所管理,而cfStr并不在ARC的管理中,由于__bridge仅仅是单纯的进行了类型转换,所以当str被ARC release后,cfStr便成为了NULL。
而当上面这段代码使用__bridge_retain进行转换后。cfStr便拥有了str对象的全部权,这时假设str被ARC release,cfStr仍然有效。
然而又由于Core Foundation中的对象也存在引用计数概念。所以须要使用CFRelease()手动的对cfStr进行release操作。
代码例如以下:
NSString *str = [NSString stringWithFormat…];
CFStringRef cfStr = (__bridge_retain CFStringRef)str;
...
CFRelease(cfStr);至于__bridge_transfer,从上文能够得知其用于将对象的全部权转移,所以CF(Core Foundation简写)对象在使用__bridge_transfer转换为Foundation对象后被释放。
CFStringRef cfStr = CFStringCreate…();
NSString *str = (__bridge_transfer NSString *)cfStr;
// 在非ARC环境下,上面这句等同于
NSString *str = cfStr;
CFRelease(cfStr);实际上,在Core Foundation内部存在两个用于CF对象和Foundation对象转换的函数
CFTypeRef CFBridgingRetain(id X) {
return (__bridge_retained CFTypeRef)X;
}
id CFBridgingRelease(CFTypeRef X) {
return (__bridge_transfer id)X;
}使用这两个函数相同能够进行两者对象之间的类型转换。
总结
- bridge 用于被ARC管理的对象和不被ARC管理的对象之间的转换
- __bridge 仅仅负责单纯的类型转换,须要格外注意对象的生存周期。
- __bridge_retain 将被ARC管理的对象转换为不被ARC管理的对象的同一时候,将ARC管理的对象retain。使其部分成为不被ARC管理的对象(描写叙述非常不当,自行多揣摩)。
- __bridge_transfer 将不被ARC管理的对象转换为被ARC管理的对象的同一时候,将不被ARC管理的对象release。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/116290.html原文链接:https://javaforall.cn
边栏推荐
- 最新版本的CodeSonar改进了功能安全性,支持MISRA,C ++解析和可视化
- Solve the problem that the executable file of /bin/sh container is not found
- What are the official stock trading apps in the country? Is it safe to use
- Do you have to make money in the account to open an account? Is the fund safe?
- Differences and connections between MinGW, mingw-w64, tdm-gcc and other tool chains "suggestions collection"
- 【矩阵乘】【NOI 2012】【cogs963】随机数生成器
- Mongodb learn from simple to deep
- 智能软件分析平台Embold
- 目标:不排斥 yaml 语法。争取快速上手
- Deep learning model compression and acceleration technology (VII): mixed mode
猜你喜欢

OneSpin 360 DV新版发布,刷新FPGA形式化验证功能体验
MySQL约束之默认约束default与零填充约束zerofill
![嵌入式系统真正安全了吗?[ OneSpin如何为开发团队全面解决IC完整性问题 ]](/img/af/61b384b1b6ba46aa1a6011f8a30085.png)
嵌入式系统真正安全了吗?[ OneSpin如何为开发团队全面解决IC完整性问题 ]

C语言 整型 和 浮点型 数据在内存中存储详解(内含原码反码补码,大小端存储等详解)

智能软件分析平台Embold

Helix QAC 2020.2新版静态测试工具,最大限度扩展了标准合规性的覆盖范围
![Is embedded system really safe? [how does onespin comprehensively solve the IC integrity problem for the development team]](/img/af/61b384b1b6ba46aa1a6011f8a30085.png)
Is embedded system really safe? [how does onespin comprehensively solve the IC integrity problem for the development team]

How does codesonar help UAVs find software defects?

上海交大最新《标签高效深度分割》研究进展综述,全面阐述无监督、粗监督、不完全监督和噪声监督的深度分割方法

Cantata9.0 | 全 新 功 能
随机推荐
字符串中数据排序
国家正规的股票交易app有哪些?使用安不安全
2022年在启牛开中银股票的账户安全吗?
Small guide for rapid formation of manipulator (12): inverse kinematics analysis
凌云出海记 | 赛盒&华为云:共助跨境电商行业可持续发展
Differences and connections between MinGW, mingw-w64, tdm-gcc and other tool chains "suggestions collection"
Jetty:配置连接器[通俗易懂]
恶魔奶爸 A0 英文零基础的自我提升路
Spark judges that DF is empty
OneSpin | 解决IC设计中的硬件木马和安全信任问题
【矩阵乘】【NOI 2012】【cogs963】随机数生成器
静态测试工具
开户必须往账户里面赚钱吗,资金安全吗?
写一下跳表
现在网上开户安全么?想知道我现在在南宁,到哪里开户比较好?
Mongodb learn from simple to deep
MySQL约束之默认约束default与零填充约束zerofill
CodeSonar通过创新型静态分析增强软件可靠性
Micro service remote debug, nocalhost + rainbow micro service development second bullet
ERROR: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your