Update:Краш на второй адресной книги (контакты) подстановки
Я считаю, что проблема лежит где-то в том, как я храню ссылки на ABRecordRef
. Я в настоящее время просто висит на значении, которое доставлено peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:
, а не CFRetain
. Из документации неясно, следует ли ее сохранить.
Я работаю над iPhone-приложением и взаимодействует с адресной книгой, используя рамки AddressBook и AddressBookUI. Я использую ABPeoplePickerNavigationController
, чтобы представить список контактов пользователю, и я получаю итоговый результат ABRecordRef
как переменную экземпляра в пользовательском классе.
Это все работает отлично при первом использовании. Тем не менее, второй время я выбираю кого-то из контактов (даже другого человека), мое приложение взрывается EXC_BAD_ACCESS
по вызову ABRecordCopyValue
. Я регистрирую указатели, и они определенно разные при каждом выборе контакта (даже если один и тот же контакт дважды).
Я не понимаю, как эта ссылка может быть освобождена. Утечка памяти наверняка, но почему она работает нормально в первый раз, а не вторая?
Вот фактический называют это умирает на:
- (NSString*)displayName {
return CFBridgingRelease(ABRecordCopyValue(self.contact, kABPersonFirstNameProperty));
}
Вот некоторые отладочный вывод, если это полезно вообще:
Printing description of self->_contact:
(ABRecordRef) _contact = 0x1f582dc0
(lldb) expr (CFTypeRef)ABRecordCopyValue(self.contact, kABPersonFirstNameProperty)
error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=1, address=0xd1f57cc1).
The process has been returned to the state before execution.
Да, я возвращаю «НЕТ». – devios1