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,所以我应该什么时候释放弹出控制器?
答案 0 :(得分:5)
正如在几个地方所提到的,呈现弹出窗口的方法(从矩形或工具栏按钮)不会保留弹出窗口。因此,您的呈现视图控制器需要保留对它的引用并在适当的时间释放它。
如上所述,您可以通过将呈现视图控制器设置为popover的委托来完成此操作。一种更简单(如果内存效率稍低)的方法是声明一个retain属性来保存UIPopoverController。创建弹出窗口时,将其分配给保留它的属性。如果您稍后创建另一个弹出窗口,它将在您重新分配属性时释放上一个弹出窗口。不要忘记在呈现视图控制器的dealloc方法(以及viewDidUnload)中释放属性。
此方法不会泄漏,您无需处理代理。但是,您可能会将UIPopoverController对象保留的时间超过必要的时间。您可以自行决定是否对您的应用程序感兴趣。
答案 1 :(得分:2)
尝试自动释放popover: [historyPop autorelease]
。presentPopoverFromRect
不会保留popover,因此autorelease在这里不起作用。您需要将您的类设置为弹出控制器的委托,并在popoverControllerDidDismissPopover:
中释放弹出窗口。