Утечка памяти 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);

}

Получение утечек здесь:

  1. NSString *str = ABRecordCopyValue(ref, kABPersonFirstNameProperty);
  2. NSString *strSub = ABRecordCopyValue(ref, kABPersonFirstNameProperty);
  3. NSArray *arrayPh = (NSArray *)ABMultiValueCopyArrayOfAllValues(multival);

2 ответа

Решение

Вам нужно освободить объекты, которые были первоначально скопированы, когда вы закончите с ними:

[str release];
[strSub release];
[arrayPh release];

Если ARC включен, вам может понадобиться CFRelease вместо этого (и разыграть соответственно).

Итак, почему не выпустили их?

CFRelease(str);
CFRelease(strSub);
CFRelease(arrayPh);
Другие вопросы по тегам