UIPopoverController dealloc被称为ARC环境

Fei*_*anZ 19 memory-management dealloc uipopovercontroller ios automatic-ref-counting

在第二次显示弹出控制器时(在解除它然后重新显示它之后),我收到以下错误:

因未捕获的异常'NSGenericException'而终止应用程序,原因:' - [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];
}
Run Code Online (Sandbox Code Playgroud)

我想保留修复问题的popover,但这是一个ARC环境,所以我没有保留.有没有办法让我修复错误(不关闭文件的ARC并且必须手动为整个文件执行内存)?

编辑:弹出窗口存储为ivar:

@property (strong) UIPopoverController *pc;
Run Code Online (Sandbox Code Playgroud)

有没有人有这个问题的解决方案(可能是ARC覆盖)?我将提交BR作为CodaFi建议,但解决方案仍然会很好,因为这是一个重大项目的障碍.如果这是不可能的,那么我想我会自己动手.

SKe*_*ken 18

我遇到了同样的问题,并通过将popover控制器保留在强大的实例变量中来修复它,并在重置属性之前显式解除它,并在第二次运行中分配了新的弹出控制器.在您的示例中,您应该添加如下内容:

- (IBAction)createNewScore:(id)sender {
    if (self.pc) {
         [self.pc dismissPopoverAnimated:YES];
    }
Run Code Online (Sandbox Code Playgroud)