UIPopoverController 在运行 iOS 5.0.1 的 iPad 上崩溃?

Posted

技术标签:

【中文标题】UIPopoverController 在运行 iOS 5.0.1 的 iPad 上崩溃?【英文标题】:UIPopoverController crash on iPad running iOS 5.0.1? 【发布时间】:2011-12-13 02:11:10 【问题描述】:

我在 iPad 上使用 ios 5 上的 UIImagePickerController,我的应用程序刚刚被拒绝,因为它最终崩溃了。它不会在我这边崩溃,但我确信它与 UIPopoverController 有关。

请指出任何看起来不好的地方!

显示 UIImagePickerController:

- (IBAction)photoLibraryiPad 
if (popoverController) 
    if ([self.popoverController isPopoverVisible]) 
        [self.popoverController dismissPopoverAnimated:YES];
        [popoverController setDelegate:nil];
        [popoverController release];
    
 else 
    if ([UIImagePickerController isSourceTypeAvailable:
         UIImagePickerControllerSourceTypeSavedPhotosAlbum])
    
        UIImagePickerController *imagePicker =
        [[UIImagePickerController alloc] init];
        imagePicker.delegate = self;
        imagePicker.sourceType =
        UIImagePickerControllerSourceTypePhotoLibrary;
        imagePicker.allowsEditing = YES;

        self.popoverController = [[UIPopoverController alloc]
                                  initWithContentViewController:imagePicker];

        popoverController.delegate = self;

        [self.popoverController presentPopoverFromRect:photolibrarybutton.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

        [imagePicker release];
    

那么这就是他们崩溃的地方:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 

    if ([self.popoverController isPopoverVisible]) 
    [self.popoverController dismissPopoverAnimated:YES];
    [popoverController setDelegate:nil];
    [popoverController release];


    [noimageAvailable setHidden:YES];
    UIImage *originalImage = (UIImage *) [info objectForKey:
                                     UIImagePickerControllerEditedImage];  
    [imgPic setImage:originalImage forState:UIControlStateNormal];
    // Hide picker selector
    [picker dismissModalViewControllerAnimated: YES];
    [picker release];


【问题讨论】:

【参考方案1】:

两件事:

1) 当你释放弹出框时,你应该将delegate设置为nil。 popoverController.delegate = nil 在致电 [popoverController release] 之前。如果您尝试多次使用选择器,它也可能会崩溃。委托正在调用一个不再存在的对象。

2) 检查弹出框是否可见时,首先检查它是否存在。

【讨论】:

另外我相信我在第一个代码 sn-p 的 else 语句中泄漏了弹出框控制器,我应该如何正确释放它? 我最终修复了崩溃。事实证明,在我关闭选择器后,我不得不关闭弹出框,这是有道理的。但无论如何,我将如何修复泄漏? 看起来不错。在委托方法中,在释放之前将选取器的委托设置为 nil。

以上是关于UIPopoverController 在运行 iOS 5.0.1 的 iPad 上崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

UIPopoverController 的奇怪错误

UIPopoverController 在 iOS 8 中的大小不正确

UIPopoverController、Xcode 6、IOS 8 使用 Swift

UIPopoverController 在 iOS 8 / Xcode 6 中没有关闭

ipad - 关闭 UIPopoverController

如何在执行冗长的操作时隐藏 UIPopoverController?