UIPopoverController和内存管理

Jon*_*an. 5 iphone memory-management objective-c ipad

    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];
Run Code Online (Sandbox Code Playgroud)

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

Ada*_*gan 5

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

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

这种方法不会泄漏,您不需要处理代理.但是,您可能会将UIPopoverController对象保留的时间超过必要的时间.您可以自行决定是否关注您的应用.