当前位置:网站首页>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

原网站

版权声明
本文为[Full stack programmer webmaster]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/188/202207072056575165.html