3

我只在模拟器中遇到了这个崩溃。在真实设备上,它可以正常工作和调试。(因此它不是太重要,但我正在做一个模拟器可以派上用场的演示文稿。)

- (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)上运行良好

4

1 回答 1

4

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

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

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

EDIT2:所以我在做什么

- (BOOL)peoplePickerNavigationController:shouldContinueAfterSelectingPerson:

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

- (void)peoplePickerNavigationControllerDidCancel:

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

于 2012-10-20T12:55:14.097 回答