在弹出窗口仍然可见的情况下达到了UIPopovercontroller的dealloc


111

我向你保证,我确实在为我的问题寻找答案,但是没有一个是有帮助的。在这里,我得到了一个简单的代码,应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,我没有进行任何保留,释放或自动释放。UIPopoverControllers受益于ARC时是否需要特别考虑?

Answers:


203

UIPopoverControllers应该始终保存在实例变量中。为其创建强大的属性是一个好习惯。

更新:

从iOS 8开始,您应该使用UIPopoverPresentationController。然后,您无需保留对弹出窗口的引用,因为它是由演示文稿控制器管理的。

代码示例(在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
哦,我明白了。但这不像UIAlertView吗?我从来没有一个ivar,我只是在需要的地方分配它的初始值,显示它,然后[用于]发布。popovercontroller有什么不同?
Mikayil Abdullayev 2012年

17
@Mikayil alertView由其超级视图保留(因为所有视图都是保留的),但是popoverController不是视图,因此没有超级视图,因此如果您不保留它,任何人都不会保留它(或将其存储在一个范围比当前方法更长的强变量中(例如iVar)。
fzwo 2012年

1
但是我仍然对UIPopoverController的保留计数感到困惑。因为我先分配了一张支票,然后再分配和初始化一张支票。而且只有当它为零时,我才分配一个新的。但是在第一次分配它之后,我再也没有得到它了。我的意思是我一次调用一个方法。在那里,我分配并初始化我的ivar。下次当我下次再次调用该方法时,我发现我的ivar已分配。如果ARC解决了这个问题,那么它将在何时发布。还是自动释放它?
Mikayil Abdullayev 2012年

当对象被释放或将其设置为nil时,ARC将释放@Mikayil ivars
Felix

但他们没有在文档中提及这一点,在“ 如何使用”部分中,他们使用局部变量
Amit Battan 2014年

11

当函数退出时,没有其他对弹出控件的引用,因此将其释放为时过早。

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

提姆


在释放之前,我还应该不能首先看到它吗?
Mikayil Abdullayev 2012年

10

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

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

然后改变

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

对于

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

11
您不必将其放入.h文件中。这将使其公开,除非您希望这样做,否则只需将其作为.m文件中的属性即可。
约书亚舞
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.