Память, все еще увеличивающаяся, когда использование CFRelease для ABRecordCopyValue?

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

-(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; кто может объяснить меня это :(.спасибо!

5
задан Vladimir 21 January 2010 в 12:57
поделиться

4 ответа

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

См. Core Foundation - Memory Management

5
ответ дан 14 December 2019 в 19:13
поделиться

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

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

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

Сбрасывает ли это память на начальный объем?

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

.
0
ответ дан 14 December 2019 в 19:13
поделиться

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

 // 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
ответ дан 14 December 2019 в 19:13
поделиться

Это вообще работает для вас? Фактический поиск информации? Это то, что я использую для извлечения 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
ответ дан 14 December 2019 в 19:13
поделиться