у меня есть проблема, делают головную боль, я просто создаю метод:
-(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; кто может объяснить меня это :(.спасибо!
Ваш код не так. Последний звонок AbaddressbookgetPersonWithRecordid следует за основным фоном «Получить правило». Это означает, что у вас нет владения возвращаемой стоимостью, и поэтому вам не нужно его отпустить.
Возможно, при запуске ABAddressBookGetPersonWithRecordID
и/или ABRecordCopyValue
используются некоторые автореализованные объекты, о которых вы не знаете, и это приведет к увеличению объема памяти. Однако она будет освобождена, когда ближайший пул авторелиза будет слит. Это не является проблемой для вашего приложения.
Попробуйте поместить цикл в свой собственный пул авторелизаций и осушить пул после выполнения цикла:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// do computation
[pool release];
Сбрасывает ли это память на начальный объем?
Также, в общем, попробуйте использовать XCode's Instruments Memory Leaks вместо того, чтобы рассматривать использование памяти - это может быть только полезным, но Memory Leaks является основным инструментом для поиска, ну... утечек памяти :)
.Я не уверен, но я думаю, что это может быть то, что происходит ...
// 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
или просто делать все это на одной строке?
Это вообще работает для вас? Фактический поиск информации? Это то, что я использую для извлечения 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);