我对以下实例所需的对象所有权模式有些不清楚。当我的UIViewController将popover控制器,操作表或其他视图控制器呈现为模态时,我是否需要挂起对该子控制器的保留引用,直到它被解除为止?
换句话说,以下几行代码是否有效地“转移”了所有权?
[aPopoverController presentPopoverFromBarButtonItem:someButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:NO];
[anActionSheet showFromBarButtonItem:someButtonItem animated:NO];
[aViewController presentModalViewController:someOtherViewController animated:YES];
有人能指出我关于这个主题的明确文件吗?
答案 0 :(得分: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];
}
答案 1 :(得分: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以确保安全。实际上,在你dealloc之前,模态控制器总是会被解雇,所以这不是问题。你会注意到Apple也在[UIView setAnimationDelegate:]中违反了这个规则,它实际上保留了你设置的委托。