【问题标题】:CFRelease(addressBook) crashes my iOS appCFRelease(addressBook) 使我的 iOS 应用程序崩溃
【发布时间】:2014-11-06 03:11:02
【问题描述】:
- (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

【问题讨论】:

    标签: ios memory-management addressbook


    【解决方案1】:

    地址簿不是导致崩溃的东西(直接)。

    您并没有保留您的人,您只是获得了对他/她的参考。尝试在你的人身上使用CFRetain

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

    【讨论】:

    • 嗨,Dean,你已经解决了这个问题,我的表扬。我会在一秒钟内接受,但你能帮我进一步理解为什么我必须留住这个人吗?在我返回到方法之后,为什么 ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook, call.uid);不存储一个人?为什么当用户按下附件按钮时调用委托方法时我应该保留它所以它应该再次抓住这个人并像第一次一样继续,我不知道为什么我必须保留这个人..你能帮忙
    • 这没有任何意义,因为我已经创建了一个通讯录,我使用该通讯录获取我想要的人员记录并将其存储在人员变量中。如果我释放通讯录,为什么人员变量会导致崩溃???
    • 你需要更好地理解Core Foundation。当您收到名称中带有“Get”的东西时,这意味着您有一个指向该对象的临时指针。 Get 返回的任何内容都是临时的。另一方面,创建意味着您拥有这个新对象。
    • @DavidH 绝对正确,但我认为他做得还不够——你需要更好地理解内存管理和引用计数——仅仅因为你知道某事现在在哪里并不意味着它会永远存在,它可能会消失。你通过调用retain(或在本例中为CFRetain)告诉iOS 不要让它消失。阅读以下内容:developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/…(以及那里的内存管理文档)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多