Чтение адреса электронной почты от контактов перестало работать со странной проблемой памяти

Я озадачен.

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

ABRecordRef personDealingWith;

от person аргумент

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier {

и все кажется прекрасным до этой точки. В первый раз, когда следующий код выполняется, все хорошо. Когда впоследствии выполнено, я могу получить проблемы. Во-первых, код:

// following line seems to make the difference (issue 1)
// NSLog(@"%d", ABMultiValueGetCount(ABRecordCopyValue(personDealingWith, kABPersonEmailProperty)));

// construct array of emails
ABMultiValueRef multi = ABRecordCopyValue(personDealingWith, kABPersonEmailProperty);
CFIndex emailCount = ABMultiValueGetCount(multi);

if (emailCount > 0) {
    // collect all emails in array
    for (CFIndex i = 0; i < emailCount; i++) {
        CFStringRef emailRef = ABMultiValueCopyValueAtIndex(multi, i);
        [emailArray addObject:(NSString *)emailRef];
        CFRelease(emailRef);
    }
}

// following line also matters (issue 2)
CFRelease(multi);

Если скомпилировано, как записано, никаких ошибок или проблем статического анализа. Это отказывает с a

*** -[Not A Type retain]: message sent to deallocated instance 0x4e9dc60

ошибка.

Но ожидайте, существует больше! Я могу зафиксировать его любым из двух способов.

Во-первых, я могу не прокомментировать NSLog во главе функции. Я получаю утечку от NSLog's ABRecordCopyValue каждый раз через, но код, кажется, хорошо работает.

Кроме того, я могу прокомментировать

CFRelease(multi);

в конце, который делает точно то же самое. Ошибки статической компиляции, но выполняющий код.

Таким образом без утечки, эта функция катастрофические отказы. Для предотвращения катастрофического отказа мне нужно к памяти кровоизлияния. Ни один не отличное решение.

Кто-либо может указать на то, что продолжается?

5
задан Jeff Atwood 27 June 2011 в 04:25
поделиться