UIPopoverController在运行iOS 5.0.1的iPad上崩溃?
我在iOS 5上使用UIImagePickerController和iPad,我的应用程序刚刚被拒绝,因为它在终端崩溃了。它不会在我这边崩溃,但我确信它与UIPopoverController有关 请指出任何看起来不好的地方 要显示UIImagePickerController,请执行以下操作:UIPopoverController在运行iOS 5.0.1的iPad上崩溃?,ios,ipad,uiimagepickercontroller,uipopovercontroller,Ios,Ipad,Uiimagepickercontroller,Uipopovercontroller,我在iOS 5上使用UIImagePickerController和iPad,我的应用程序刚刚被拒绝,因为它在终端崩溃了。它不会在我这边崩溃,但我确信它与UIPopoverController有关 请指出任何看起来不好的地方 要显示UIImagePickerController,请执行以下操作: - (IBAction)photoLibraryiPad { if (popoverController) { if ([self.popoverController isPopoverVisi
- (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) 释放popover时,应将委托设置为nil<调用[popoverController release]
之前,code>popoverController.delegate=nil。如果您多次尝试使用选择器,它也会崩溃。委托正在调用一个不再存在的对象
2) 检查popover是否可见时,请先检查它是否存在 另外,我相信我在第一个代码片段的else语句中泄漏了popover控制器,我应该如何正确地释放它?我最终修复了崩溃。结果是,在我解雇了拾音器之后,我不得不解雇了爆米花,这是有道理的。但不管怎样,我该怎么修复那个漏洞呢?看起来不错。在委托方法中,在释放选择器之前,将其委托设置为nil。