CFRelease(addressBook)崩溃我的iOS应用程序

时间:2012-08-21 16:49:23

标签: ios memory-management addressbook

- (void)tableView:(UITableView *)tableView 
accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
    NSUInteger row = indexPath.row;

    if (row == NSNotFound)
        return;

    if (call.uid != kABRecordInvalidID)
    {
        ABAddressBookRef addressBook = ABAddressBookCreate();

        ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook,
                                                                call.uid);


       // CFRelease(addressBook);// commenting out this makes the program not crash

}
}

这是问题,静态代码分析告诉我,我有内存泄漏,因为我没有发布地址簿。我尝试释放它,但如果我返回到它被释放的屏幕并再次调用此函数,应用程序崩溃。

想象一下,我点击uitableview的附件按钮。我做我必须做的事情并返回到原始窗口,然后再次单击uitableview的附件按钮,程序崩溃并出现此错误:

  

- [Not A Type retain]:发送到解除分配的实例0x618d810的消息

1 个答案:

答案 0 :(得分:8)

地址簿不会导致崩溃(直接)。

你没有留住你的人,你只是在提及他/她。尝试在您的人身上使用CFRetain

ABAddressBookRef addressBook = ABAddressBookCreate();
ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook,
                                                        call.uid);
CFRetain(person);
CFRelease(addressBook);