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

}
}

Тук е проблемът, статичният анализ на кода ми казва, че имам изтичане на памет, защото не пускам адресната книга. Опитвам се да го освободя, но ако се върна на екрана, където беше пуснат, и извикам тази функция отново, приложението се срива.

Представете си, че щраквам върху бутона за аксесоар за uitableview. Правя каквото трябва и се връщам към оригиналния прозорец, след което щраквам отново върху бутона за аксесоари на uitableview и програмата се срива с тази грешка:

-[Not A Type retain]: съобщение, изпратено до освободен екземпляр 0x618d810


person j2emanue    schedule 21.08.2012    source източник


Отговори (1)


Адресната книга не е нещото, което причинява срива (директно).

Вие не задържате вашата личност, вие просто получавате препратка към него/нея. Опитайте да използвате CFRetain върху себе си.

ABAddressBookRef addressBook = ABAddressBookCreate();
ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook,
                                                        call.uid);
CFRetain(person);
CFRelease(addressBook);
person deanWombourne    schedule 21.08.2012
comment
Здравей Дийн, ти реши проблема и моите похвали. Ще приема след секунда, но можете ли да ми помогнете допълнително, за да разбера защо трябва да задържа човека. След като се върна обратно към метода, защо е ABRecordRef person = ABAddressBookGetPersonWithRecordID(addressBook, call.uid); не съхранява човек? защо трябва да го запазя, когато методът на делегиране се извиква всеки път, когато потребителят натисне бутона за аксесоари, така че трябва просто да грабне човека отново и да продължи като първия път, нямам представа защо трябва да задържа човека.. можете ли да помогнете - person j2emanue; 21.08.2012
comment
Няма смисъл, защото имам адресна книга, която създадох, използвам тази адресна книга, за да получа записа на лицето, който искам, и да го съхраня в променливата person. ако освободя адресната книга, защо променливата person причинява срива??? - person j2emanue; 21.08.2012
comment
Трябва да разберете по-добре Core Foundation. Когато получите нещо с Get в името, това означава, че имате временен указател към обекта. Всичко, върнато от Get, е временно. Създаване от друга страна означава, че притежавате този нов обект. - person David H; 22.08.2012
comment
@DavidH е абсолютно прав, но не мисля, че той стигна достатъчно далеч - трябва да разберете по-добре управлението на паметта и преброяването на препратките - само защото знаете къде е нещо сега, не означава, че ще бъде там завинаги, може да си отиде. Кажете на iOS да не го оставя да изчезне, като извикате retain (или CFRetain в този случай). Прочетете това: developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ (и правата част на документите за управление на паметта там) - person deanWombourne; 22.08.2012