当前位置:网站首页>A brief understanding of the in arc__ bridge、__ bridge_ Retained and__ bridge_ transfer
A brief understanding of the in arc__ bridge、__ bridge_ Retained and__ bridge_ transfer
2022-07-07 20:59:00 【Full stack programmer webmaster】
Hello everyone , I meet you again , I'm the king of the whole stack .
Source of the article :http://www.outflush.com/2015/03/introduction-of-arc-bridge-type-transfer/
In the face of bridge Before the explanation of relevant modifiers . First understand the following
- Core Foundation It's a group. C Language interface . It is associated with Foundation Provide interfaces for the same functions . just Foundation The framework provides Objective-C Interface .
- Core Foundation The concept of reference counting also exists for objects in , is equivalent to Foundation Of retain/release, The corresponding interface is CFRetain/CFRelease
- The objects of these two frameworks can be converted to each other , Such a transformation is called Toll-Free bridge
- When using ARC when ,Core Foundation Objects in are not ARC Managed by . therefore Core Foundation and Foundation In the process of mutual conversion of objects in, it will involve the conversion of all rights of objects . Here we use bridge Modifier .
Ordinary objects and C Conversion between language pointers
void *p = NULL;
{
id obj = [[NSObject alloc] init];
p = (__bridge void *)obj;
}
NSLog(@"Hello");
// There will be errors
NSLog(@"%@", [(__bridge id)p class]);In the above code obj By ARC management ,p It's a C Language pointer . be not in ARC Within the scope of management . When the program runs to obj Beyond the scope of .ARC It will be obj to release fall , At this time p The pointer becomes NULL. So it's using __bridge You must be clear about the life cycle of the object, otherwise similar errors will occur .
Then we should use __bridge_retain Keyword to convert
p = (__bridge_retain void *)obj;
// The above code is in non ARC Can be expressed as
p = obj;
[(id)p retain];So when obj By ARC release after ,p The pointer still points to a valid object .
and __bridge_transfer Is used to pass a __bridge_retain The result of the transformation C Once again, the language pointer is converted to be ARC Common objects managed .
id obj = (__bridge_transfer id)p;
// Use non ARC To express is to
id obj = p;
[obj retain];
[(id)p release];Can see ,__bridge_transfer take p The ownership of the object pointed to is transferred to ARC Managed obj On .
When in ARC Declare in the environment id obj when . The default is strong Decorated with a modifier , therefore ARC Will take the initiative to obj Conduct retain Handle . So __bridge_transfer Just did it release Handle .
Core Foundation And Foundation Conversion between ordinary objects
We already know from above Core Foundation The concept of reference counting also exists for objects in . When in non ARC In the environment ,Core Foundation Objects and Foundation Objects can pass the standard C Language type conversion (Toll-Free bridge). And when introduced ARC Then you need bridge To switch , Because you need to clearly tell the compiler how to handle all the rights of objects .
such as :
NSString *str = [NSString stringWithFormat…];
CFStringRef cfStr = (__bridge CFStringRef)str;
...
CFRelease(cfStr);here str The object is ARC Managed by , and cfStr It's not in ARC In the management of , because __bridge Simply type conversion , So when str By ARC release after ,cfStr It becomes NULL.
When the above code uses __bridge_retain After conversion .cfStr Then I have str Ownership of the object , Now suppose str By ARC release,cfStr Still valid .
However, due to Core Foundation The concept of reference counting also exists for objects in . So we need to use CFRelease() Manual pair cfStr Conduct release operation .
The code is as follows :
NSString *str = [NSString stringWithFormat…];
CFStringRef cfStr = (__bridge_retain CFStringRef)str;
...
CFRelease(cfStr);as for __bridge_transfer, It can be seen from the above that it is used to transfer the full right of the object , therefore CF(Core Foundation Abbreviation ) Object is using __bridge_transfer Convert to Foundation Object is released .
CFStringRef cfStr = CFStringCreate…();
NSString *str = (__bridge_transfer NSString *)cfStr;
// In Africa ARC In the environment , The above sentence is equivalent to
NSString *str = cfStr;
CFRelease(cfStr);actually , stay Core Foundation There are two internal for CF Objects and Foundation Object conversion function
CFTypeRef CFBridgingRetain(id X) {
return (__bridge_retained CFTypeRef)X;
}
id CFBridgingRelease(CFTypeRef X) {
return (__bridge_transfer id)X;
}Using these two functions, you can perform type conversion between the two objects .
summary
- bridge Used to be ARC The object of management and not ARC Conversion between managed objects
- __bridge Only responsible for simple type conversion , Pay special attention to the life cycle of the object .
- __bridge_retain Will be ARC The managed object is converted to not be ARC Manage the object at the same time , take ARC The object of Management retain. Make its part not to be ARC The object of Management ( The description is very inappropriate , Try to figure it out for yourself ).
- __bridge_transfer Will not be ARC The managed object is converted into ARC Manage the object at the same time , Will not be ARC The object of Management release.
Publisher : Full stack programmer stack length , Reprint please indicate the source :https://javaforall.cn/116290.html Link to the original text :https://javaforall.cn
边栏推荐
- Klocwork code static analysis tool
- 201215-03-19—cocos2dx内存管理–具体解释「建议收藏」
- Postgresql数据库character varying和character的区别说明
- 【函数递归】简单递归的5个经典例子,你都会吗?
- openGl超级宝典学习笔记 (1)第一个三角形「建议收藏」
- Codeforces 474 F. Ant colony
- Nebula Importer 数据导入实践
- [function recursion] do you know all five classic examples of simple recursion?
- C language helps you understand pointers from multiple perspectives (1. Character pointers 2. Array pointers and pointer arrays, array parameter passing and pointer parameter passing 3. Function point
- [concept of network principle]
猜你喜欢
Klocwork code static analysis tool

H3C S7000/S7500E/10500系列堆叠后BFD检测配置方法
Lex & yacc of Pisa proxy SQL parsing

Helix QAC 2020.2 new static test tool maximizes the coverage of standard compliance

Nebula importer data import practice

How to meet the dual needs of security and confidentiality of medical devices?
Mysql子查询关键字的使用方式(exists)

Cantata9.0 | 全 新 功 能

Apifox interface integrated management new artifact

上海交大最新《标签高效深度分割》研究进展综述,全面阐述无监督、粗监督、不完全监督和噪声监督的深度分割方法
随机推荐
论文解读(ValidUtil)《Rethinking the Setting of Semi-supervised Learning on Graphs》
Ubuntu安装mysql8遇到的问题以及详细安装过程
ERROR: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your
写一下跳表
刚开户的能买什么股票呢?炒股账户安全吗
Lingyun going to sea | yidiantianxia & Huawei cloud: promoting the globalization of Chinese e-commerce enterprise brands
margin 等高布局
恶魔奶爸 B2 突破语法,完成正统口语练习
Codeforces 474 F. Ant colony
数值法求解最优控制问题(〇)——定义
凌云出海记 | 易点天下&华为云:推动中国电商企业品牌全球化
I Basic concepts
CodeSonar如何帮助无人机查找软件缺陷?
使用枚举实现英文转盲文
如何满足医疗设备对安全性和保密性的双重需求?
What are the official stock trading apps in the country? Is it safe to use
智能软件分析平台Embold
上海交大最新《标签高效深度分割》研究进展综述,全面阐述无监督、粗监督、不完全监督和噪声监督的深度分割方法
Numerical method for solving optimal control problem (0) -- Definition
神兵利器——敏感文件发现工具