请检查我关于释放 UIPopoverController 和 loadViewController 的方法
- (IBAction) manageCardSets:(UIBarButtonItem*)baritem {
LoadViewController *loadViewController = [[LoadViewController alloc] initWithStyle:UITableViewStylePlain];
self.loadPopover = [[UIPopoverController alloc] initWithContentViewController:loadViewController];
self.loadPopover.delegate = self;
[self.loadPopover presentPopoverFromBarButtonItem:baritem permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
[loadViewController release];
}
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
[popoverController.contentViewController release];
self.loadPopover = nil;
[_loadPopover release];
}
如您所见,我两次释放 loadViewController 并且代码有效,没有泄漏,但我有一些疑问。 如果我释放一次,则不会在 loadViewController 中调用 dealloc。
最佳答案
如果您的 loadPopover
属性是保留/复制,则以下行过度保留对象并泄漏:
self.loadPopover = [[UIPopoverController alloc] initWithContentViewController:loadViewController];
alloc-init 和属性访问器都保留对象。这应该是:
self.loadPopover = [[[UIPopoverController alloc] initWithContentViewController:loadViewController] autorelease];
这就是为什么 loadPopover
对象只有在您向它发送两个释放消息时才会被释放,但是您永远不应该诉诸这些技巧。
编辑:
您还有另一个内存管理问题。你正在释放一个你不拥有的对象:
[popoverController.contentViewController release];
保留/释放 contentViewController
是 popoverController
的职责。通过这样做,您将过度释放 contentViewController
。
总而言之,您的代码将如下所示:
- (IBAction) manageCardSets:(UIBarButtonItem*)baritem {
LoadViewController *loadViewController = [[LoadViewController alloc] initWithStyle:UITableViewStylePlain];
self.loadPopover = [[[UIPopoverController alloc] initWithContentViewController:loadViewController] autorelease];
self.loadPopover.delegate = self;
[self.loadPopover presentPopoverFromBarButtonItem:baritem permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
[loadViewController release];
}
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
self.loadPopover = nil;
}
关于ios - UIPopoverController 和内容 ViewController - 内存管理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6538439/