UIPopoverController dealloc被称为ARC环境

时间:2011-10-28 21:32:08

标签: ios memory-management uipopovercontroller dealloc automatic-ref-counting

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

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

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

- (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并且必须手动为整个文件做内存)?

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

@property (strong) UIPopoverController *pc;

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

2 个答案:

答案 0 :(得分:18)

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

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

答案 1 :(得分:3)

如果您的popover存储为强引用,则无法取消分配。可以解除分配的唯一可能性是在包含强引用(在您的示例中为self)的对象也被释放的情况下。

我认为重要的问题是当弹出窗口可见时你对你的观点做了什么。

如果你已经检查了这个,那么它必须是一个框架错误。