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

CFRelease(addressBook)使我的iOS应用程序崩溃,ios,memory-management,addressbook,Ios,Memory Management,Addressbook,问题是,静态代码分析告诉我内存泄漏是因为我没有发布地址簿。我试图释放它,但如果我返回到它被释放的屏幕并再次调用此函数,应用程序就会崩溃 因此,想象一下我单击上的附件按钮以查看uitableview。我执行我必须执行的操作并返回到原始窗口,然后再次单击uitableview的附件按钮,程序会因以下错误而崩溃: -[非类型保留]:发送到解除分配实例0x618d810的消息 地址簿不是导致崩溃的原因(直接) 你没有留住你的人,你只是得到了他/她一个参考。尝试在您的个人身上使用CFRetain - (v

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

因此,想象一下我单击上的附件按钮以查看
uitableview
。我执行我必须执行的操作并返回到原始窗口,然后再次单击
uitableview
的附件按钮,程序会因以下错误而崩溃:

-[非类型保留]:发送到解除分配实例0x618d810的消息


地址簿不是导致崩溃的原因(直接)

你没有留住你的人,你只是得到了他/她一个参考。尝试在您的个人身上使用
CFRetain

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

}
}

嗨,迪安,你已经解决了这个问题,我很赞赏你。我马上就接受,但你能帮我进一步理解为什么我要留住这个人吗。返回方法之后,为什么ABRecordRef person=ABAddressBookGetPersonWithRecordID(addressBook,call.uid);不储存一个人?每当用户按下附件按钮时调用委托方法时,为什么我要保留它,这样它就应该像第一次一样再次抓住该人并继续,我不知道为什么我必须保留该人..你能帮我吗?因为我有一个我创建的地址簿,我使用那个地址簿来获取我想要的person记录,并将其存储在person变量中。如果我发布了地址簿,为什么人变量会导致崩溃???你需要更好地理解核心基础。当您收到名称中带有“Get”的内容时,这意味着您有一个指向该对象的临时指针。Get返回的任何内容都是临时的。另一方面,“创建”意味着你拥有这个新对象。@DavidH是绝对正确的,但我认为他做得还不够——你需要更好地理解内存管理和引用计数——仅仅因为你知道某个东西现在在哪里并不意味着它将永远在那里,它可能会消失。您可以通过调用
retain
(在本例中为
CFRetain
)告诉iOS不要让它消失。通读以下内容:(以及上面的内存管理文档的rect)
ABAddressBookRef addressBook = ABAddressBookCreate();
ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook,
                                                        call.uid);
CFRetain(person);
CFRelease(addressBook);