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)
| 归档时间: |
|
| 查看次数: |
8965 次 |
| 最近记录: |