У меня есть приложение iOS, которое отображает список имен контактов в UITableView и отображает контакт с ABPersonViewController
при подключении ячейки. В этом проекте используется ARC. Если я связать ABPersonViewControllerDelegate
объект, приложение попадет в EXC_BAD_ACCESS в рамках AddressBookUI сразу после показа зрения человека:EXC_BAD_ACCESS при использовании ABPersonViewControllerDelegate
(lldb) bt
* thread #1: tid = 0x2403, 0x39ee15b0 libobjc.A.dylib`objc_msgSend + 16, stop reason = EXC_BAD_ACCESS (code=1, address=0x8)
frame #0: 0x39ee15b0 libobjc.A.dylib`objc_msgSend + 16
frame #1: 0x319eb880 AddressBookUI`-[ABPersonViewControllerHelper notifyScrollViewDidLoad] + 64
Вот UITableViewDelegate
метода (полный проект связан ниже), который показывает, как ABPersonViewController
и мой ABPersonViewControllerDelegate
(реализованный в BEVPVDelegate
) создаются, связанный, и представил:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
ABPersonViewController *pvc = [[ABPersonViewController alloc] init];
BEVPVDelegate *pvDelegate = [[BEVPVDelegate alloc] init];
pvc.displayedPerson = (__bridge ABRecordRef)[self.contents objectAtIndex:[indexPath row]];
pvc.personViewDelegate = pvDelegate; // comment out this line to prevent the crash
[self.navigationController pushViewController:pvc animated:YES];
}
Просто закомментировать строку, которая устанавливает свойство personViewDelegate на экземпляре ABPersonViewController
устраняет исключение, но мне нужно го является объектом делегирования.
Это совокупность BEVPVDelegate.m:
//
// BEVPVDelegate.m
// ABCrash
//
#import "BEVPVDelegate.h"
@implementation BEVPVDelegate
- (BOOL)personViewController:(ABPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
NSLog(@"called");
return YES;
}
@end
Вот такой скелетный проект, демонстрирующий проблема: ABCrash.zip on Dropbox
Есть ли проблема в моем коде? Есть ли способ обхода, который позволяет мне использовать ABPersonViewControllerDelegate
?
Редактировать: Я только что запустил проект в «Инструменты», и мой personViewDelegate освобождается. Если я создаю сохраненное свойство для personViewDelegate в моем UIViewController, приложение не сбой.
personViewDelegate - это свойство на ABPersonViewController, определенное Apple, поэтому я не могу изменить его от слабого к сильному. Однако я подклассифицировал ABPersonViewController, сделал его совместимым с ABPersonViewControllerDelegate, добавил 'self.personViewDelegate = self;' и реализовал метод делегата в подклассе. Это решает. – bneely