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

j2e*_*nue 3 memory-management addressbook ios

- (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

}
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

dea*_*rne 8

地址簿不是造成崩溃的原因(直接).

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

ABAddressBookRef addressBook = ABAddressBookCreate();
ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook,
                                                        call.uid);
CFRetain(person);
CFRelease(addressBook);
Run Code Online (Sandbox Code Playgroud)