我只在模拟器中遇到此崩溃。在一个真实的设备上它工作和调试很好。 (因此它不是太关键,但我正在制作一个模拟器很方便的演示文稿。)
- (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)
答案 0 :(得分:4)
您的问题是您没有对选择器保持强烈的引用。添加一个ivar来保存它,然后在委托回调中完成后,在主队列上使用一个dispatch asyn块来清除ivar并释放它。 (抱歉没有代码从iPad输入此内容)
编辑:查看showPeoplePickerController方法 - 创建选择器并将其保存为自动,当退出方法时会自动释放。您希望通过使用ivar而不是自动来保持对选择器的强引用。
然后你不想在委托回调中释放选择器 - 这通常有效,但会在意外的时候咬你,所以你想在委托回调完成后释放这种类型的对象。事实上,如果我可以使用'picker = nil'释放它,我通常会首先将对象委托属性设置为nil。在一个区块'选择器'变成'自我>选择器'。你也可以使用performSelector:afterDelay:0我也更喜欢块。
EDIT2:那我在
做什么- (BOOL)peoplePickerNavigationController:shouldContinueAfterSelectingPerson:
只是返回NO。我等到这条消息:
- (void)peoplePickerNavigationControllerDidCancel:
解散它。我还有一些其他代码弹出一个动作表,确认保存一个选定的地址,并进行解雇,但它的旧代码,不知道它现在如何工作。无论如何希望这会有所帮助。