请检查我关于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。
答案 0 :(得分:1)
如果您的loadPopover
属性是保留/复制,则以下行过度保留对象并泄漏:
self.loadPopover = [[UIPopoverController alloc] initWithContentViewController:loadViewController];
alloc-init和属性访问器都保留了对象。这应该是:
self.loadPopover = [[[UIPopoverController alloc] initWithContentViewController:loadViewController] autorelease];
这就是loadPopover
对象只有在你发送两条发布消息时才被解除分配的原因,但是你永远不应该使用这些技巧。
修改强>
您还有另一个内存管理问题。您将在此行中释放您不拥有的对象:
[popoverController.contentViewController release];
保留/释放popoverController
是contentViewController
责任。通过这样做,您过度释放 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;
}