UIPopovercontroller dealloc到达,而popover仍然可见

时间:2012-01-17 13:04:18

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

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

-(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,我没有做任何保留,重新发布或自动释放。在受益于ARC时,UIPopoverControllers是否有任何特殊考虑?

3 个答案:

答案 0 :(得分:203)

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

<强>更新

从iOS 8开始,您应该使用UIPopoverPresentationController。然后你不需要保留对popover的引用,因为它是由表示控制器管理的。

代码示例(适用于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];

答案 1 :(得分:11)

当函数退出时,没有其他对popover控制器的引用,所以它太早解除分配。

尝试将其添加为您班级的成员。

答案 2 :(得分:10)

添加@ phix23回答的内容,创建* poc属性,如下所示:

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

然后更改

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

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