ABPeoplePickerNavigationController仅在Simulator中被解雇时崩溃

时间:2012-10-20 10:25:47

标签: iphone objective-c ios ios-simulator

我只在模拟器中遇到此崩溃。在一个真实的设备上它工作和调试很好。 (因此它不是太关键,但我正在制作一个模拟器很方便的演示文稿。)

- (BOOL)peoplePickerNavigationController:

(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {


    [self displayPerson:person];

    if ([self respondsToSelector:@selector(dismissViewControllerAnimated:completion:)]){
        [self dismissViewControllerAnimated:YES completion:nil];
    } else {
        [self dismissModalViewControllerAnimated:YES];
    }

    return NO;
}

崩溃发生了:

[self dismissViewControllerAnimated:YES completion:nil];

我只看到:"Thread 1: EXC_BREAKPOINT (code=EXC_I386_BTP, subcode=0x0)"

调试窗口中没有特定输出。 Zoombies已启用。我做ARC。我正在使用故事板,但我使用以下代码以编程方式调用ABPersonPicker:

-(void)showPeoplePickerController
{

    ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];

    picker.peoplePickerDelegate = self;

    if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]) {
        [self presentViewController:picker animated:YES completion:nil];
    } else {
        [self presentModalViewController:picker animated:YES];
    }

    return;
}

请记住,它在我拥有的设备上运行良好(iPod Touch第4代,iPhone 4和iPhone 4S)

1 个答案:

答案 0 :(得分:4)

您的问题是您没有对选择器保持强烈的引用。添加一个ivar来保存它,然后在委托回调中完成后,在主队列上使用一个dispatch asyn块来清除ivar并释放它。 (抱歉没有代码从iPad输入此内容)

编辑:查看showPeoplePickerController方法 - 创建选择器并将其保存为自动,当退出方法时会自动释放。您希望通过使用ivar而不是自动来保持对选择器的强引用。

然后你不想在委托回调中释放选择器 - 这通常有效,但会在意外的时候咬你,所以你想在委托回调完成后释放这种类型的对象。事实上,如果我可以使用'picker = nil'释放它,我通常会首先将对象委托属性设置为nil。在一个区块'选择器'变成'自我>选择器'。你也可以使用performSelector:afterDelay:0我也更喜欢块。

EDIT2:那我在

做什么
- (BOOL)peoplePickerNavigationController:shouldContinueAfterSelectingPerson:

只是返回NO。我等到这条消息:

- (void)peoplePickerNavigationControllerDidCancel:

解散它。我还有一些其他代码弹出一个动作表,确认保存一个选定的地址,并进行解雇,但它的旧代码,不知道它现在如何工作。无论如何希望这会有所帮助。