UIPopoverController和内存管理

时间:2010-12-07 19:16:38

标签: iphone objective-c ipad memory-management

    UIPopoverController *historyPop = [[UIPopoverController alloc] initWithContentViewController:nav];
    [nav release];
    [historyPop setPopoverContentSize:CGSizeMake(400, 500)];
    [historyPop presentPopoverFromRect:CGRectMake(button.frame.origin.x, button.frame.origin.y, button.frame.size.width, 5) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
    //[historyPop release];

这是我当前的代码,但分析师说这可能是泄漏,因为释放线被注释掉了。但是,如果我取消注释发布行,那么应用程序崩溃并说当dealloc仍然可见时,弹出窗口上的dealloc,所以我应该什么时候释放弹出控制器?

2 个答案:

答案 0 :(得分:5)

正如在几个地方所提到的,呈现弹出窗口的方法(从矩形或工具栏按钮)不会保留弹出窗口。因此,您的呈现视图控制器需要保留对它的引用并在适当的时间释放它。

如上所述,您可以通过将呈现视图控制器设置为popover的委托来完成此操作。一种更简单(如果内存效率稍低)的方法是声明一个retain属性来保存UIPopoverController。创建弹出窗口时,将其分配给保留它的属性。如果您稍后创建另一个弹出窗口,它将在您重新分配属性时释放上一个弹出窗口。不要忘记在呈现视图控制器的dealloc方法(以及viewDidUnload)中释放属性。

此方法不会泄漏,您无需处理代理。但是,您可能会将UIPopoverController对象保留的时间超过必要的时间。您可以自行决定是否对您的应用程序感兴趣。

答案 1 :(得分:2)

尝试自动释放popover:[historyPop autorelease] presentPopoverFromRect不会保留popover,因此autorelease在这里不起作用。您需要将您的类设置为弹出控制器的委托,并在popoverControllerDidDismissPopover:中释放弹出窗口。