当前位置:网站首页>浅解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
边栏推荐
- Ubuntu安装mysql8遇到的问题以及详细安装过程
- Write a jump table
- FTP steps for downloading files from Huawei CE switches
- Nebula Importer 数据导入实践
- Jetty:配置连接器[通俗易懂]
- Cantata9.0 | new features
- Optimization cases of complex factor calculation: deep imbalance, buying and selling pressure index, volatility calculation
- Do you have to make money in the account to open an account? Is the fund safe?
- UVA 11080 – Place the Guards(二分图判定)
- 万字总结数据存储,三大知识点
猜你喜欢

如何满足医疗设备对安全性和保密性的双重需求?

AADL Inspector 故障树安全分析模块

Apifox 接口一体化管理新神器
MySQL约束之默认约束default与零填充约束zerofill
![[paper reading] maps: Multi-Agent Reinforcement Learning Based Portfolio Management System](/img/76/b725788272ba2dcdf866b28cbcc897.jpg)
[paper reading] maps: Multi-Agent Reinforcement Learning Based Portfolio Management System

Optimization cases of complex factor calculation: deep imbalance, buying and selling pressure index, volatility calculation

Measure the height of the building

Details of C language integer and floating-point data storage in memory (including details of original code, inverse code, complement, size end storage, etc.)

Onespin | solve the problems of hardware Trojan horse and security trust in IC Design

万字总结数据存储,三大知识点
随机推荐
Implement secondary index with Gaussian redis
恶魔奶爸 A0 英文零基础的自我提升路
机械臂速成小指南(十一):坐标系的标准命名
权限不足
Cocos2d-x 游戏存档[通俗易懂]
嵌入式系统真正安全了吗?[ OneSpin如何为开发团队全面解决IC完整性问题 ]
Apifox interface integrated management new artifact
How to choose financial products? Novice doesn't know anything
easyui 日期控件清空值
不落人后!简单好用的低代码开发,快速搭建智慧管理信息系统
华为CE交换机下载文件FTP步骤
使用高斯Redis实现二级索引
阿洛的烦恼
智能软件分析平台Embold
C语言多角度帮助你深入理解指针(1. 字符指针2. 数组指针和 指针数组 、数组传参和指针传参3. 函数指针4. 函数指针数组5. 指向函数指针数组的指针6. 回调函数)
Codeforces 474 F. Ant colony
Is it safe to open a stock account at present? Can I open an account online directly.
Cantata9.0 | new features
字符串中数据排序
论文解读(ValidUtil)《Rethinking the Setting of Semi-supervised Learning on Graphs》