UIPopoverController,UIActionSheet和模态视图控制器的保留/释放模式?

Ben*_*tto 14 iphone uiviewcontroller uiactionsheet uipopovercontroller

我对以下实例所需的对象所有权模式有些不清楚.当我的UIViewController将弹出控制器,操作表或其他视图控制器呈现为模态时,我是否需要挂起对该子控制器的保留引用,直到它被解除为止?

换句话说,以下几行代码是否有效地"转移"了所有权?

[aPopoverController presentPopoverFromBarButtonItem:someButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:NO];

[anActionSheet showFromBarButtonItem:someButtonItem animated:NO];

[aViewController presentModalViewController:someOtherViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)

有人能指出我关于这个主题的明确文件吗?

val*_*ine 26

UIPopoverViewController具有略微不同的内存管理/拥有.呈现弹出窗口不会保留内存,因此您无法将popviewcontroller的所有权转移到呈现对象.

为避免内存泄漏,您必须采用UIPopoverControllerDelegate并实现DidDismissPopOver方法,如下所示:

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
    [popoverController release];
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以安全地分配和呈现PopOver:

-(void)showSearch:(id)sender {
    SearchViewController *searchVC = [[SearchViewController alloc] init];
    UIPopoverController *popVC = [[UIPopoverController alloc] initWithContentViewController:searchVC];
    popVC.delegate = self;
    [popVC setPopoverContentSize:CGSizeMake(320, 100)];
    [popVC presentPopoverFromRect:CGRectMake(200, 200, 320, 100) inView:self.view permittedArrowDirections:0 animated:YES];
    [searchVC release];
}
Run Code Online (Sandbox Code Playgroud)