1

我有一个 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 创建保留属性,应用程序不会崩溃。

4

1 回答 1

2

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

于 2013-05-18T06:36:14.520 回答