我有一个 iOS 应用程序,它在 UITableView 中显示联系人姓名列表,并ABPersonViewController
在点击单元格时显示联系人。本项目使用 ARC。如果我关联一个ABPersonViewControllerDelegate
对象,应用程序会在显示人员视图后立即在 AddressBookUI 框架中点击 EXC_BAD_ACCESS:
(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
是显示如何创建、关联和呈现theABPersonViewController
和 my 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];
}
只需注释掉在ABPersonViewController
实例上设置 personViewDelegate 属性的行即可消除异常,但我需要这个委托对象。
这是 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
这是一个演示问题的简单项目:Dropbox 上的 ABCrash.zip
我的代码有问题吗?是否有允许我使用的解决方法ABPersonViewControllerDelegate
?
编辑:我刚刚在 Instruments 中运行了该项目,并且我的 personViewDelegate 即将发布。如果我在 UIViewController 中为 personViewDelegate 创建保留属性,应用程序不会崩溃。