zoukankan      html  css  js  c++  java
  • 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 }

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

  • 相关阅读:
    2016/9/18结对编程之需求分析与原型设计。
    K米评测
    软件工程的实践项目课程的自我目标
    url学习1
    调研构建之法指导下的作品
    初次尝试对接
    第二次结对编程作业——毕业导师智能匹配
    uml
    Qt中采用cairo将图片导出至PDF
    SQL删除重复的记录(只保留一条)
  • 原文地址:https://www.cnblogs.com/dashunzi/p/3770438.html
Copyright © 2011-2022 走看看