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 }
对比起来,是不是又可以继续愉快的写代码了呢?