Я в тупике.
Я пытаюсь получить список всех адресов электронной почты, которые есть у человека. Я использую 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);
Если скомпилирован так, как написано, ошибок или проблем статического анализа не будет. Это вылетает с
*** -[Not A Type retain]: message sent to deallocated instance 0x4e9dc60
ошибка.
Но подождите, это еще не все! Я могу исправить это любым из двух способов.
Во-первых, я могу раскомментировать NSLog в верхней части функции. Я получаю утечку из ABRecordCopyValue
NSLog каждый раз, но код работает нормально.
Также я могу прокомментировать
CFRelease(multi);
в конце, что делает то же самое. Статические ошибки компиляции, но код запущен.
Так что без утечки эта функция вылетает. Чтобы предотвратить сбой, мне нужно кровоточить память. И тоже не лучшее решение.
Кто-нибудь может указать на то, что происходит?