当前位置:网站首页>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
边栏推荐
- 想杀死某个端口进程,但在服务列表中却找不到,可以之间通过命令行找到这个进程并杀死该进程,减少重启电脑和找到问题根源。
- 现在网上开户安全么?想知道我现在在南宁,到哪里开户比较好?
- What are the official stock trading apps in the country? Is it safe to use
- Codesonar Webinar
- Write a jump table
- Helix QAC 2020.2 new static test tool maximizes the coverage of standard compliance
- Can Huatai Securities achieve Commission in case of any accident? Is it safe to open an account
- Deep learning model compression and acceleration technology (VII): mixed mode
- 权限不足
- AADL Inspector 故障树安全分析模块
猜你喜欢
Make this crmeb single merchant wechat mall system popular, so easy to use!
上海交大最新《标签高效深度分割》研究进展综述,全面阐述无监督、粗监督、不完全监督和噪声监督的深度分割方法
OneSpin | 解决IC设计中的硬件木马和安全信任问题
Airiot helps the urban pipe gallery project, and smart IOT guards the lifeline of the city
目标:不排斥 yaml 语法。争取快速上手
How does codesonar help UAVs find software defects?
Mongodb learn from simple to deep
神兵利器——敏感文件发现工具
程序猿赚的那点钱算个P啊!
如何满足医疗设备对安全性和保密性的双重需求?
随机推荐
easyui 日期控件清空值
恶魔奶爸 C
Cantata9.0 | new features
H3C S7000/S7500E/10500系列堆叠后BFD检测配置方法
Small guide for rapid formation of manipulator (11): standard nomenclature of coordinate system
【C语言】指针进阶---指针你真的学懂了吗?
2022年在启牛开中银股票的账户安全吗?
使用高斯Redis实现二级索引
Codesonar enhances software reliability through innovative static analysis
Tensorflow2. How to run under x 1 Code of X
Klocwork code static analysis tool
OneSpin 360 DV新版发布,刷新FPGA形式化验证功能体验
Micro service remote debug, nocalhost + rainbow micro service development second bullet
Deep learning model compression and acceleration technology (VII): mixed mode
Tensorflow2.x下如何运行1.x的代码
201215-03-19—cocos2dx内存管理–具体解释「建议收藏」
恶魔奶爸 B3 少量泛读,完成两万词汇量+
AADL inspector fault tree safety analysis module
guava多线程,futurecallback线程调用不平均
目标:不排斥 yaml 语法。争取快速上手