Я в тупике.
Я пытаюсь получить список всех адресов электронной почты, которые есть у человека.
Я использую 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);
в конце, который делает то же самое. Статические ошибки компиляции, но работает код.
Так что без утечки эта функция вылетает. Чтобы предотвратить сбой, мне нужно кровоизлияние в память. Ни то, ни другое не является хорошим решением.
Кто-нибудь может указать, что происходит?