我有一个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创建了一个保留属性,那么该应用程序不会崩溃。
答案 0 :(得分:2)
如何在ABPersonViewController中定义属性personViewDelegate?我认为你让它变弱了。只需将其更改为强类型即可。委托对象将在立即创建后释放,因为弱属性不会保留它。希望它有所帮助。