UIPopovercontroller dealloc在popup窗口仍然可见时到达

我向你保证,我确实在我的问题中寻找答案,但没有一个是有帮助的。 在这里我得到了一个简单的代码,应该在UIPopoverController提供一个UIImagePickerController

 -(void)takePicture:(id)sender{ UIImagePickerController *picker=[[UIImagePickerController alloc] init]; picker.delegate=self; picker.sourceType=UIImagePickerControllerSourceTypeCamera; picker.allowsEditing=YES; UIPopoverController *poc=[[UIPopoverController alloc] initWithContentViewController:picker]; [poc presentPopoverFromBarButtonItem:bbItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:NO]; } 

现在,即使从第一次,我得到[UIPopoveController dealloc]而…错误和程序崩溃。 根据ARC,我没有做任何保留,放弃或autoreleases。 从ARC受益时, UIPopoverControllers有没有特别的考虑?

UIPopoverControllers应该始终保存在一个实例variables中。 为它创造一个强大的财产是一个很好的做法。

更新:

从iOS 8开始,您应该使用UIPopoverPresentationController 。 然后,您不需要保留对该popup窗口的引用,因为它由演示文稿控制器进行pipe理。

代码示例(适用于iPhone和iPad):

 UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.sourceType = UIImagePickerControllerSourceTypeCamera; picker.allowsEditing = YES; picker.modalPresentationStyle = UIModalPresentationPopover; UIPopoverPresentationController* popoverPC = picker.popoverPresentationController; popoverPC.barButtonItem = bbItem; popoverPC.permittedArrowDirections = UIPopoverArrowDirectionAny; [self presentViewController:picker animated:YES completion:nil]; 

当函数退出时,没有其他对popover控制器的引用,所以它被释放得太早。

尝试添加它作为您class级的成员。

蒂姆

添加@ phix23回答什么,创build* poc属性是这样的:

 @property (nonatomic, retain) IBOutlet UIPopoverController *poc; 

然后改变

 UIPopoverController *poc = [[UIPopoverController alloc] initWithContentViewController:picker]; 

对于

 self.poc = [[UIPopoverController alloc] initWithContentViewController:picker];