Потенциальная утечка памяти

Это функция для перезагрузки моей адресной книги после сохранения изменений, строка

self.addressbook=ABAddressbookCreateWithOptions()

а также

self.contactAdd=ABAddressBookCopyArrayOfAllPeople(self.addressBook)

отображаются как потенциальные точки утечки памяти.

contactAdd имеет тип CFArrayRef, а адресная книга — ABAddressBookRef.

  -(void)reloadAddressBook
    {
    //   if(self.addressBook)
    //       CFRelease(self.addressBook);
       self.addressBook = ABAddressBookCreateWithOptions(NULL,NULL);
        if(ABAddressBookHasUnsavedChanges(self.addressBook))
        {

            ABAddressBookSave(self.addressBook,NULL);
        }
    //    if(self.contactAdd)
    //        CFRelease(self.contactAdd);

        self.contactAdd=ABAddressBookCopyArrayOfAllPeople(self.addressBook);
    }

person Raon    schedule 02.08.2013    source источник
comment
поместите свой соответствующий код здесь :)   -  person    schedule 02.08.2013
comment
Вы выпускаете этот объект temp позже?   -  person Baby Groot    schedule 02.08.2013
comment
Используйте _bridge_transfer при распределении, потому что вы назначаете CFArray, который является основным массивом без метода освобождения или освобождения массива. Чтобы посадить его на сохранение, освободите землю цели C, используя _bridge.   -  person iEinstein    schedule 02.08.2013
comment
@AshutoshMishra каждый CFRRelease, который я дал, показывает потенциальную утечку памяти ..   -  person Raon    schedule 02.08.2013
comment
Да, потому что это основной класс фреймворка, поэтому есть некоторые утечки.   -  person iEinstein    schedule 02.08.2013
comment
@AshutoshMishra, могу ли я решить это?   -  person Raon    schedule 02.08.2013
comment
Не волнуйтесь слишком сильно, это не создаст особых проблем   -  person iEinstein    schedule 02.08.2013
comment
@AshutoshMishra есть ли способ, кроме как изменить мой CFArray на NSAttay, чтобы решить эту потенциальную утечку памяти ??   -  person Raon    schedule 02.08.2013
comment
прочитайте этот stackoverflow.com/ вопросы/17967515/   -  person iEinstein    schedule 02.08.2013
comment
@AshutoshMishra: «это основной базовый фреймворк, поэтому есть некоторые утечки» — это грубое упрощение. Если вы получаете объект из CF или чего-то на основе CF, вам нужно его очистить. CF не обязательно означает утечки, и принятие утечек только потому, что CF был задействован, является неаккуратным программированием.   -  person Peter Hosey    schedule 03.08.2013


Ответы (3)


используйте _addressbook вместо self.addressBook.

person Francis F    schedule 05.08.2013
comment
этот парень легенда! - person Raon; 05.08.2013

используйте другую переменную для назначения, как это

contactAddtemp=ABAddressBookCopyArrayOfAllPeople(self.addressBook); 
self.contactAdd=(__bridge_retained CFArrayRef) CFBridgingRelease(contactAddtemp); 

У меня это работало в xcode 4.2, но когда я проверил, это не работает в 4.6, возможно, потому, что он использует ABAddressBookCreateWithOptions(NULL,NULL) вместо ABAddressBookCreate()

person Francis F    schedule 02.08.2013
comment
Зачем вам вызывать CFBridgingRelease, а затем сразу же приводить это с помощью __bridge_retained? - person Peter Hosey; 03.08.2013
comment
Это уравновешивает, но да, в этом нет никакого смысла, но, похоже, работа выполняется в xcode 4.2. - person Francis F; 08.08.2013

В Core Foundation функции Create и Copy возвращают ссылку на право собственности.

Вам нужно сбалансировать это, вызвав CFRelease для возвращаемого объекта (адресная книга, массив людей и все остальное, что вы получаете от таких функций), или приведя его с помощью __bridge_transfer (или вызвав CFBridgingRelease):

self.addressBook = CFBridgingRelease(ABAddressBookCreateWithOptions(…));
person Peter Hosey    schedule 03.08.2013