iOS两个框架之间的类型转换--"桥接"技术

  话不多说,直接举例说明吧.场景模拟:需要开发一个通讯录相关功能,实现访问以及添加等等.这时,需要使用的框架是Core Foundation.而此框架使用的是C语言,例如:CFArrayRef,CFStringRef等等.以下是读取联系人信息的简单代码:

  

 1 - (void)readMessage

 2 {

 3     ABAddressBookRef abR = ABAddressBookCreateWithOptions(NULL, NULL);

 4     CFArrayRef arrayR = ABAddressBookCopyArrayOfAllPeople(abR);

 5     CFIndex count = CFArrayGetCount(arrayR);

 6     for (CFIndex i = 0; i < count; ++i) {

 7         ABRecordRef recR = CFArrayGetValueAtIndex(arrayR, i);

 8         CFStringRef strR = ABRecordCopyValue(recR, kABPersonLastNameProperty);

 9         NSLog(@"%@",strR);

10         CFRelease(strR);

11     }

12     CFRelease(arrayR);

13     CFRelease(abR);

14 

15 }

 

  在以上代码中,不知道各位注意没有,为了防止内存泄漏,我们必须不断的使用CFRelease来释放资源,即使在ARC下.再加上那纠结的函数,这些对于习惯了Foundation框架和ARC的猿猿们,是非常不习惯的.那么怎样做到,使用我们习惯的NSArray,NSString(Foundation框架)不再关心内存呢?如题,我们只需要使用桥接技术就可以解决:

  

 1 - (void)readMessage2

 2 {

 3     ABAddressBookRef abR = ABAddressBookCreateWithOptions(NULL, NULL);

 4     

 5     NSArray *array = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(abR);

 6     int count = array.count;

 7     for (int i = 0; i < count; ++i) {

 8         ABRecordRef recR = (__bridge ABRecordRef)array[i];

 9         NSString *str = (__bridge NSString *)ABRecordCopyValue(recR, kABPersonLastNameProperty);

10         NSLog(@"%@",str);

11     }

12     

13     CFRelease(abR);

14 }

  对比起来,是不是又可以继续愉快的写代码了呢?

你可能感兴趣的:(类型转换)