当前位置:网站首页>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 代码静态分析工具
- 2022年在启牛开中银股票的账户安全吗?
- Validutil, "Rethinking the setting of semi supervised learning on graphs"
- Klocwork code static analysis tool
- Le capital - investissement est - il légal en Chine? C'est sûr?
- 201215-03-19—cocos2dx内存管理–具体解释「建议收藏」
- 恶魔奶爸 A3阶段 近常速语流初接触
- How to meet the dual needs of security and confidentiality of medical devices?
- gridView自己定义做时间排版「建议收藏」
猜你喜欢
How to meet the dual needs of security and confidentiality of medical devices?
Dachang classic pointer written test questions
Details of C language integer and floating-point data storage in memory (including details of original code, inverse code, complement, size end storage, etc.)
The latest version of codesonar has improved functional security and supports Misra, c++ parsing and visualization
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
Apifox 接口一体化管理新神器
OneSpin | 解决IC设计中的硬件木马和安全信任问题
H3C S7000/S7500E/10500系列堆叠后BFD检测配置方法
嵌入式系统真正安全了吗?[ OneSpin如何为开发团队全面解决IC完整性问题 ]
Don't fall behind! Simple and easy-to-use low code development to quickly build an intelligent management information system
随机推荐
Helix QAC 2020.2新版静态测试工具,最大限度扩展了标准合规性的覆盖范围
npm uninstall和rm直接删除的区别
Codeforces 474 F. Ant colony
Small guide for rapid formation of manipulator (11): standard nomenclature of coordinate system
I have to use my ID card to open an account. Is the bank card safe? I don't understand it
ISO 26262 - 基于需求测试以外的考虑因素
如何满足医疗设备对安全性和保密性的双重需求?
目标:不排斥 yaml 语法。争取快速上手
Airiot helps the urban pipe gallery project, and smart IOT guards the lifeline of the city
Phoenix JDBC
How to choose fund products? What fund is suitable to buy in July 2022?
ERROR: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your
Is it safe to open an account of BOC shares in kainiu in 2022?
Mongodb learn from simple to deep
H3C S7000/S7500E/10500系列堆叠后BFD检测配置方法
AADL inspector fault tree safety analysis module
Is embedded system really safe? [how does onespin comprehensively solve the IC integrity problem for the development team]
Cocos2d-x game archive [easy to understand]
上海交大最新《标签高效深度分割》研究进展综述,全面阐述无监督、粗监督、不完全监督和噪声监督的深度分割方法
数值法求解最优控制问题(〇)——定义