__bridge相关内存机制

Core Foundation不支持ARC,那么在做Core Foundation与Objective-C类型转换的时候就需要考虑以何种规则来管理对象的内存。

__bridge(修饰符)

只是声明类型转变,但是不做内存管理规则的转变。
例:

CFStringRef s1 = (__bridge CFStringRef) [[NSString alloc] initWithFormat:@"Hello, %@!", name];

只是做了NSString到CFStringRef的转化,但管理规则未变,依然要用Objective-C类型的ARC来管理s1,你不能用CFRelease()去释放s1。

__bridge_retained(修饰符) or CFBridgingRetain(函数)

表示将指针类型转变的同时,将内存管理的责任由原来的Objective-C交给Core Foundation来处理,也就是,将ARC转变为MRC。
例:

NSString *s1 = [[NSString alloc] initWithFormat:@"Hello, %@!", name];
CFStringRef s2 = (__bridge_retained CFStringRef)s1;
// or CFStringRef s2 = (CFStringRef)CFBridgingRetain(s1);
// do something with s2
//...
CFRelease(s2); // 注意要在使用结束后加这个

在第二行做了转化,这时内存管理规则由ARC变为了MRC,需要手动的来管理s2的内存,而对于s1,即使将其置为nil,也不能释放内存。

__bridge_transfer(修饰符) or CFBridgingRelease(函数)

这个修饰符和函数的功能和上面那个__bridge_retained相反,它表示将管理的责任由Core Foundation转交给Objective-C,即将管理方式由MRC转变为ARC。
例:

CFStringRef result = CFURLCreateStringByAddingPercentEscapes(. . .);
NSString *s = (__bridge_transfer NSString *)result;
//or NSString *s = (NSString *)CFBridgingRelease(result);
return s;

这里将result的管理责任交给了ARC来处理,就不需要再显式地调用CFRelease()了。

所以,bridge相关的修饰符or函数,名称里包含retain的,就是将ARC转为MRC(由OC转为Core Foundation机制),此时需要我们手动管理内存,在对象使用完毕后,需要主动调用对应的release方法。

参考文章:iOS开发ARC内存管理技术要点

你可能感兴趣的:(__bridge相关内存机制)