14

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

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

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

[anActionSheet showFromBarButtonItem:someButtonItem animated:NO];

[aViewController presentModalViewController:someOtherViewController animated:YES];

有人可以指出我关于这个主题的明确文档吗?

4

2 回答 2

26

UIPopoverViewController 的内存管理/拥有略有不同。呈现弹出框不会保留内存,因此您无法将 popviewcontroller 的所有权转移给呈现对象。

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

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
    [popoverController release];
}

这样,您可以安全地分配并呈现 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];
}
于 2010-11-17T10:26:00.647 回答
1

呈现模态视图控制器会保留 UIViewController。这实际上从文档中并不清楚。但是,我使用以下代码对其进行了测试...

NSLog(@"BEFORE %d", [self.setupViewController retainCount]);
[self.navigationController presentModalViewController:self.setupViewController animated:YES];
NSLog(@"AFTER %d", [self.setupViewController retainCount]);

self.setupViewController 已在本地保留,但显示它会输出以下内容:

2010-05-19 10:07:36.687 LocateMe[27716:207] BEFORE 1
2010-05-19 10:07:36.762 LocateMe[27716:207] AFTER 3

所以它可能被保留在本地 modalViewController 属性以及视图层次结构中。解雇它将平衡这些。

所以底线是,如果您想直接控制它,请保留它,但您不必这样做。

编辑 - 需要明确的是,如果您将自己设置为对象,则正确的模式是始终保留对象。那是因为为了安全起见,您应该在您的 dealloc 中将委托设置为 nil。但实际上,模态控制器总是会在您解除分配之前被解除,所以这不是问题。您会注意到 Apple 在 [UIView setAnimationDelegate:] 中也违反了此规则,它实际上保留了您设置的委托。

于 2010-05-19T17:10:07.660 回答