Утечка памяти ABAdressbook
Я получаю утечки памяти в следующем методе:
- (void) SyncContactData
{
ABAddressBookRef addressBook = ABAddressBookCreate();
CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBook);
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);
for( int i = 0 ; i < nPeople ; i++ )
{
//dicContact = [[NSMutableDictionary alloc] init];
ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i );
NSString *str = ABRecordCopyValue(ref, kABPersonFirstNameProperty);
NSString *strSub = ABRecordCopyValue(ref, kABPersonFirstNameProperty);
int ii = [[NSString stringWithFormat:@"%@",strSub] length];
if(str != nil || ii == 0)
[arrNames addObject:strSub];
else
[arrNames addObject:@""];
CFTypeRef multival = ABRecordCopyValue(ref, kABPersonPhoneProperty);
NSArray *arrayPh = (NSArray *)ABMultiValueCopyArrayOfAllValues(multival);
if([arrayPh count] > 0)
[arrPhone addObject:[arrayPh objectAtIndex:0]];
else
[arrPhone addObject:@""];
CFRelease(multival);
}
CFRelease(addressBook);
CFRelease(allPeople);
}
Получение утечек здесь:
NSString *str = ABRecordCopyValue(ref, kABPersonFirstNameProperty);
NSString *strSub = ABRecordCopyValue(ref, kABPersonFirstNameProperty);
NSArray *arrayPh = (NSArray *)ABMultiValueCopyArrayOfAllValues(multival);
2 ответа
Решение
Вам нужно освободить объекты, которые были первоначально скопированы, когда вы закончите с ними:
[str release];
[strSub release];
[arrayPh release];
Если ARC включен, вам может понадобиться CFRelease
вместо этого (и разыграть соответственно).
Итак, почему не выпустили их?
CFRelease(str);
CFRelease(strSub);
CFRelease(arrayPh);