Ios UIPopoverController解除锁定被调用—;电弧环境

Ios UIPopoverController解除锁定被调用—;电弧环境,ios,memory-management,uipopovercontroller,dealloc,automatic-ref-counting,Ios,Memory Management,Uipopovercontroller,Dealloc,Automatic Ref Counting,在第二次显示popover控制器时(在关闭它然后重新显示它之后),我得到以下错误: 由于未捕获的异常“NSGenericeException”而终止应用程序,原因:“-[UIPopoverController dealloc]在popover仍然可见时到达。” 堆栈跟踪只是一组十六进制,SIGABRT每次都发生在UIApplicationMain。以下是按钮触发的代码: - (IBAction)createNewScore:(id)sender { if (self.pc)

在第二次显示popover控制器时(在关闭它然后重新显示它之后),我得到以下错误:

由于未捕获的异常“NSGenericeException”而终止应用程序,原因:“-[UIPopoverController dealloc]在popover仍然可见时到达。”

堆栈跟踪只是一组十六进制,SIGABRT每次都发生在UIApplicationMain。以下是按钮触发的代码:

- (IBAction)createNewScore:(id)sender {
    if (self.pc)
        if (self.pc.popoverVisible)
            return;
        else
        // Breakpoint is hit here—crashes after this line
            [self.pc presentPopoverFromBarButtonItem:(UIBarButtonItem *)sender permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
    NGDocumentInfoViewController *documentInfoVC = [[NGDocumentInfoViewController alloc] initWithBlankDocumentTargetInManagedObjectContext:self.context];
    UINavigationController *navc = [[UINavigationController alloc] initWithRootViewController:documentInfoVC];
    UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneCreatingNewScore:)];
    UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelCreatingNewScore:)];
    navc.navigationBar.topItem.leftBarButtonItem = doneButton;
    navc.navigationBar.topItem.rightBarButtonItem = cancelButton;
    CGSize popoverSize = CGSizeMake(documentInfoVC.view.bounds.size.width, documentInfoVC.view.bounds.size.height);
    documentInfoVC.contentSizeForViewInPopover = popoverSize;
    UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:navc];
    popover.delegate = self;
    self.pc = popover;
    [popover presentPopoverFromBarButtonItem:(UIBarButtonItem *)sender permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
}
我只想保留能够解决问题的popover,但这是一个ARC环境,所以我没有保留。我有没有办法修复错误(不必关闭文件的ARC,也不必手动为整个文件执行内存)

编辑:popover存储为ivar:

@property (strong) UIPopoverController *pc;


是否有人对此问题有解决方案(可能是ARC覆盖)?我会按照CodaFi的建议提交一个BR,但解决方案还是不错的,因为这是一个重大项目的障碍。如果这是不可能的,那么我想我会自己滚。

如果您的popover存储为强引用,则无法释放。当包含强引用的对象(
self
在您的示例中)也被释放时,它可以被释放的唯一可能性是

我认为重要的问题是,当popover可见时,您如何处理您的视图


如果您已经检查过,那么它一定是一个框架错误。

我遇到了相同的问题,并通过按照建议将popover控制器保留在一个强实例变量中,并在使用第二次运行的操作中分配的新popover控制器重置属性之前显式取消了它,从而修复了该问题。在您的示例中,您应该添加如下内容:

- (IBAction)createNewScore:(id)sender {
    if (self.pc) {
         [self.pc dismissPopoverAnimated:YES];
    }

您能否在
-[UIPopoverController dealloc]
上设置一个符号断点(使用Xcode中断点导航器底部的“+”),并查看它在调试器中的停止位置?可能那里的堆栈跟踪可以提供一些关于释放popover的信息。断点没有被显式命中。它在UIApplcationMain发生时暂停,然后崩溃,这似乎表明它至少部分与运行循环有关。我很想称之为ARC的bug,因为它的级别太低了。完整堆栈跟踪:
createNewScore
是否在主线程上执行?是的,此处没有显式线程。如果涉及到线程,它们将出现在苹果的代码中,而不是我的代码中。只是一个小小的警告,UIPopover作为一个整体与其他ios实现相比是垃圾。提交你的bug报告,但从我从WWDC的人那里听说,苹果不会很快修复弹出窗口。创建实例变量对我来说很有效。如果您不想使用按钮,触摸popover的外部也会在以后取消它。