문제

I have an iOS app that shows a list of contact names in a UITableView, and displays a contact with ABPersonViewController when a cell is tapped. This project uses ARC. If I associate an ABPersonViewControllerDelegate object, the app hits an EXC_BAD_ACCESS in the AddressBookUI framework immediately after showing the person view:

(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

Here's the UITableViewDelegate method (full project linked below) that shows how the ABPersonViewController and my ABPersonViewControllerDelegate (implemented as BEVPVDelegate) are created, associated, and presented:

- (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];
}

Simply commenting out the line that sets the personViewDelegate property on the ABPersonViewController instance eliminates the exception, but I need this delegate object.

This is the entirety of 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

Here's a bare-bones project demonstrating the problem: ABCrash.zip on Dropbox

Is there a problem in my code? Is there a workaround that allows me to use the ABPersonViewControllerDelegate?

Edit: I just ran the project in Instruments, and my personViewDelegate is getting released. If I create a retained property for the personViewDelegate in my UIViewController, the app doesn't crash.

도움이 되었습니까?

해결책

How do you define the property personViewDelegate in ABPersonViewController? I think you make it weak. Just change it to strong type. The delegate object will be released after creating immediately, because weak property will not hold it. Hope it helpful.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top