编写高质量代码的52个有效方法

52个有效方法(49) - 对自定义其内存管理语义的collec

2018-10-09  本文已影响15人  SkyMing一C

很多时候都会使用到CoreFoundation的函数,其返回值为CoreFoundation框架的对象,如果想转换为Foundation框架的对象就可以使用桥接方式来搞定。

Core Foundation框架和Foundation框架中有很多数据类型可以交替转换。能够被交替转换的数据类型也被叫做Toll-Free Bridged数据类型。这意味着你能像参数一样使用相同的数据结构对一个Core Foundation的函数进行调用,或者像Objective-C的消息接受模式一样执行。

Core Foundation内存管理

编译器并不会自动管理Core Foundation对象的生命周期。你必须告诉编译器对象的语义所属关系通过使用一种转换(定义在objc/runtime.h)或者Core Foundation风格的宏(定义在 NSObject.h)。

1. __bridge
NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];
CFURLRef ref = (__bridge CFURLRef)url;
2. __bridge_retained
NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];
CFURLRef ref = (__bridge_retained CFURLRef)url;
CFRelease(ref);
2. __bridge_transfer
CFStringRef cfString= CFURLCreateStringByAddingPercentEscapes(
                                                                  NULL,
                                                                  (__bridge CFStringRef)text,
                                                                  NULL,
                                                                  CFSTR("!*’();:@&=+$,/?%#[]"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
NSString *ocString = (__bridge_transfer CFStringRef)cfString;
要点
  1. 通过无缝桥接技术,可以在Foundation框架中的Objective-C对象与CoreFoundation框架中的C语言数据结构之间来回转换。

  2. 在CoreFoundation层面创建collection时,可以指定许多回调函数,这些函数表示此collection应如何处理其元素。然后,可运用无缝桥接技术,将其转换成具备特殊内存管理语义的Objective-C collection。

上一篇 下一篇

猜你喜欢

热点阅读