使用ABPersonViewControllerDelegate时的EXC_BAD_ACCESS

时间:2013-05-18 06:21:03

标签: ios exc-bad-access addressbook abpersonviewcontroller addressbookui

我有一个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方法(下面链接的完整项目),其中显示了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];
}

简单地注释掉在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

这是一个展示问题的简单项目:ABCrash.zip on Dropbox

我的代码有问题吗?是否有解决方法允许我使用ABPersonViewControllerDelegate

编辑:我刚刚在Instruments中运行了该项目,我的personViewDelegate正在发布。如果我在我的UIViewController中为personViewDelegate创建了一个保留属性,那么该应用程序不会崩溃。

1 个答案:

答案 0 :(得分:2)

如何在ABPersonViewController中定义属性personViewDelegate?我认为你让它变弱了。只需将其更改为强类型即可。委托对象将在立即创建后释放,因为弱属性不会保留它。希望它有所帮助。