Потенциальная утечка памяти для ABRecordCopyValue - PullRequest
1 голос
/ 14 февраля 2011

Я создаю приложение, которое требует от меня загрузить все контакты в источнике данных таблицы из адресной книги iPhone. На ходу

Сборка и анализ

для следующего фрагмента

ABAddressBookRef addressBook = ABAddressBookCreate(); 
int nPeople = ABAddressBookGetPersonCount(addressBook); 
CFRelease(addressBook);

for(int i=0; i < nPeople; i++ ){
    //ABRecordRef person = [allPeople objectAtIndex:i];
    NSString *name = @"";
    if(ABRecordCopyValue([allPeople objectAtIndex:i], kABPersonFirstNameProperty) != NULL)
        name = [[NSString stringWithFormat:@"%@", ABRecordCopyValue([allPeople objectAtIndex:i], kABPersonFirstNameProperty)] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    [dataSource addObject: name];
}

[allPeople release];

Я получаю потенциальную утечку памяти для линии

name = [[NSString stringWithFormat:@"%@", ABRecordCopyValue([allPeople objectAtIndex:i], kABPersonFirstNameProperty)] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

Я очень устал это чинить, но не смог. Пожалуйста, помогите мне.

Любая помощь будет высоко оценена.

Заранее спасибо !!

Ответы [ 3 ]

4 голосов
/ 14 февраля 2011

Вы не публикуете результат ABRecordCopyValue; попробуйте присвоить его переменной и освободить его и конец цикла. Использование переменной также сделает ваш код намного легче для чтения и лучше выявит причину этих проблем.

Кстати, вы также дважды вызываете ABRecordCopyValue с одинаковыми аргументами, вы должны делать это только один раз (используя переменную, как указано выше).

2 голосов
/ 31 мая 2012

Я думаю, что вы можете сделать, как показано ниже:

CFTypeRef copiedValue = ABRecordCopyValue([allPeople objectAtIndex:i], kABPersonFirstNameProperty);
name = [[NSString stringWithFormat:@"%@", copiedValue] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
CFRelease(copiedValue);
1 голос
/ 27 ноября 2013

Вы можете напрямую соединиться с NSString. Это может быть немного яснее:

CFTypeRef fn_typeref = ABRecordCopyValue(person, kABPersonFirstNameProperty);
CFTypeRef ln_typeref = ABRecordCopyValue(person, kABPersonLastNameProperty);

NSString * firstName = (__bridge NSString *) fn_typeref;
NSString * lastName  = (__bridge NSString *) ln_typeref;

NSLog(@"Name:%@ %@", firstName, lastName);

CFRelease(fn_typeref);    // releasing CFTypeRef
CFRelease(ln_typeref);

// use firstName and lastName down here
NSLog(@"Name:%@ %@", firstName, lastName);
...