首页 > 代码库 > iOS两个框架之间的类型转换--"桥接"技术

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 }

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