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

4

1 回答 1

8

通讯录不是(直接)导致崩溃的东西。

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

ABAddressBookRef addressBook = ABAddressBookCreate();
ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook,
                                                        call.uid);
CFRetain(person);
CFRelease(addressBook);
于 2012-08-21T16:55:37.713 回答