Ios AddressBook bug排查

问题: 当执行下面InsertNewMobileContactsBriefToClient方法的时候。会有80%+的几率出现系统闪退!

  • 程序块
-(void)InsertNewMobileContactsBriefToClient
{
    CFErrorRef myError = NULL;
    ABAddressBookRef addressBook = nil;
    addressBook = ABAddressBookCreateWithOptions(NULL, &myError);
    if(myError)
    {
        if(addressBook)
            CFRelease(addressBook);
        return;
    }
    __weak typeof(self) weakSelf  = self;
    ABAddressBookRequestAccessWithCompletion(addressBook,
                                             ^(bool granted, CFErrorRef error) {
                                                 if (granted) {
                                                     [weakSelf InsertNewContactsToDb:addressBook];
                                                 } else {
                                                     // Handle the error
                                                 }
                                                 
                                                 if(addressBook)
                                                     CFRelease(addressBook);
                                             });
    
}

-(void)InsertNewContactsToDb:(ABAddressBookRef)addressBook
{
    CFArrayRef personArray = ABAddressBookCopyArrayOfAllPeople(addressBook);
    NSInteger count = CFArrayGetCount(personArray);
   NSLog(@"SysContact.InsertNewMobileContactsBriefToClient:手机中共有%ld位联系人",(long)count);
    
    for(int i=0;i<count;i++)
    {
        [NSThread sleepForTimeInterval:0.01];
        ABRecordRef person = CFArrayGetValueAtIndex(personArray, i);
        NSInteger personId = ABRecordGetRecordID(person);
        
        //读入到的记录保存到数据库
    }
    
    NSLog(@"从手机中新导入了%d个联系人..完成!",totalCount);
    if(personArray)
        CFRelease(personArray);
}

通过友盟收集到的日志信息为:[Application received signal SIGSEGV]类型的错误,通过反解析发现
以下代码块会闪退

   if(addressBook)
   CFRelease(addressBook);

解决方法

  • 移除方法InsertNewContactsToDb中的以下代码:
      if(personArray)
       CFRelease(personArray);

原来
CFArrayRef personArray = ABAddressBookCopyArrayOfAllPeople ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &myError) 为同一个addressbook对象。
只能释放一个。

参考地址:
http://stackoverflow.com/questions/1209130/iphone-sdk-exc-bad-access-with-cfrelease-for-abaddressbookref

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 iOS崩溃是让iOS开发人员比较头痛的事情,app崩溃了,说明代码写的有问题,这时如何快速定位到崩溃的地方很...
    齐滇大圣阅读 65,485评论 29 443
  • [这是第14篇] 序: iOS Crash问题是iOS开发中难以忽视的存在,本文就捕获iOS Crash、Cras...
    南华coder阅读 9,968评论 21 116
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,099评论 19 139
  • 东京无疑是亲子出游的不二之选:这里拥有各种充满奇思妙想的主题乐园、美术馆、博物馆,让你和从小陪伴长大的哆啦A梦、H...
    Shirley唐一泓阅读 169评论 0 0
  • 拖延症这个词越来越流行了,上网查了查定义,拖延症是指自我调节失败,在能够预料后果有害的情况下,仍然把计划要做的事情...
    茉莉米兰阅读 377评论 0 3