Память все еще увеличивается при использовании CFRelease для ABRecordCopyValue? - PullRequest
5 голосов
/ 20 января 2010

У меня проблема с головной болью, я просто создаю метод:

-(void) main{

      for (int i = 0; i< 100;i++) {
           [self getPhoneOfContact:i];
      }
 }

-(void)getPhoneOfContact:(NSInteger)id_contact {

     ABRecordRef record = ABAddressBookGetPersonWithRecordID(addressBook,id_contact);

     CFTypeRef ref1;
     ref1 = ABRecordCopyValue(record,kABPersonPhoneProperty);

     CFRelease(record);
     CFRelease(ref1); 
}

Я думаю, что память будет приближаться к константам, потому что я освободил скопированную память, но на самом деле она увеличивается для каждого цикла i; кто может мне это объяснить :(. спасибо!

Ответы [ 4 ]

5 голосов
/ 22 января 2010

Ваш код неверный. Вызов ABAddressBookGetPersonWithRecordID следует базовому фундаменту «Получить правило». Это означает, что у вас нет права собственности на возвращаемое значение, и, следовательно, вам не нужно выпускать его.

См. Core Foundation - Управление памятью

0 голосов
/ 10 февраля 2010

Это у вас вообще работает? Фактический поиск информации? Это то, что я использую для извлечения kABPersonPhoneProperty из записей.

ABMutableMultiValueRef multi = ABRecordCopyValue(person, kABPersonPhoneProperty);
    for (CFIndex i = 0; i < ABMultiValueGetCount(multi); i++) {
        CFStringRef phoneNumberLabel = ABMultiValueCopyLabelAtIndex(multi, i);
        CFStringRef phoneNumber      = ABMultiValueCopyValueAtIndex(multi, i);
                  // Do stuff with the info.
        CFRelease(phoneNumberLabel);
        CFRelease(phoneNumber);
    }
    CFRelease(multi);
0 голосов
/ 22 января 2010

Я не уверен, но я думаю, что это может быть то, что происходит ...

 // 1. alloc and return a record address to record
 ABRecordRef record = ABAddressBookGetPersonWithRecordID(addressBook,id_contact);
 // 2. alloc and return the default CFTypeRef to ref1
 CFTypeRef ref1;
 // 3. copy and return the value of kABPersonPhoneProperty
 ref1 = ABRecordCopyValue(record,kABPersonPhoneProperty);
 // release 1
 CFRelease(record);
 // release 3
 CFRelease(ref1);

Таким образом, 2 все еще протекает.Может быть, попробуйте сделать CFTypeRef ref1 = nil или просто сделать все это в одной строке?

0 голосов
/ 20 января 2010

Возможно, что при запуске ABAddressBookGetPersonWithRecordID и / или ABRecordCopyValue используются некоторые автоматически выпущенные объекты, о которых вы не знаете, и это приведет к увеличению памяти. Он будет выпущен, однако, когда будет слит ближайший пул авто-релизов. Это не проблема с вашим приложением.

Попробуйте поместить цикл в собственный пул автоматического выпуска и очистить пул после выполнения цикла:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// do computation
[pool release];

Означает ли это "сброс" памяти к исходному количеству?

Также, в общем, попробуйте использовать инструменты XCode Утечки памяти вместо того, чтобы смотреть на использование памяти - это может быть только полезно, но Утечки памяти является основным инструментом для поиска, хорошо .. утечки памяти:)

...