1

У меня есть приложение 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, приложение не сбой.

ответ

2

Как вы определяете свойство personViewDelegate в ABPersonViewController? Я думаю, вы делаете его слабым. Просто измените его на сильный. Объект делегата будет выпущен после создания немедленно, потому что слабое свойство не будет его удерживать. Надеюсь, это полезно.

+0

personViewDelegate - это свойство на ABPersonViewController, определенное Apple, поэтому я не могу изменить его от слабого к сильному. Однако я подклассифицировал ABPersonViewController, сделал его совместимым с ABPersonViewControllerDelegate, добавил 'self.personViewDelegate = self;' и реализовал метод делегата в подклассе. Это решает. – bneely

Смежные вопросы