2010-12-07 164 views
5
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在popover上仍然可见,所以何时应该释放popover控制器?UIPopoverController和内存管理

回答

5

正如在几处提到的那样,呈现弹出窗口的方法(从rect或工具栏按钮中)不会保留弹出窗口。因此,您的呈现视图控制器需要保存对它的引用并在适当的时候释放它。

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

这种方法不会泄漏,你不需要处理代表。但是,您可能会将UIPopoverController对象保留更长的时间。您需要确定这是否是您应用的关注点。

2

尝试自动释放弹出窗口: [historyPop autorelease]presentPopoverFromRect不保留popover,所以autorelease在这里不起作用。您需要将您的班级设置为弹出式窗口控制器的代表,并在popoverControllerDidDismissPopover:中释放弹出窗口。

+0

发生同样的错误 – 2010-12-07 19:36:10

+2

对不起,我的错误 - `presentPopoverFromRect`不保留弹出窗口,所以autorelease在这里不起作用。您需要将您的类设置为popover控制器的委托,并在`popoverControllerDidDismissPopover:`中释放弹出窗口。看到这个问题的第二个答案:http://stackoverflow.com/questions/2867709/retain-release-pattern-for-uipopovercontroller-uiactionsheet-and-modal-view-con – bosmacs 2010-12-07 19:39:53