我有一个通用应用程序,其iPad部分使用UIPopoverController,它显示与iPhone部分共享的UIViewController。当iPhone版本加载并释放视图控制器时,一切正常(没有内存泄漏)。当iPad版本加载它时,两个项目,一个NSDictionary和一个NSArray泄漏。UIPopoverController内存泄漏
在视图控制器,创建了两个对象,并因此dealloc的
- (void)setupModels {
fonts = [[NSDictionary alloc] initWithObjectsAndKeys:
@"Baskerville", @"Baskerville",
@"Georgia", @"Georgia",
@"HelveticaNeue", @"Helvetica Neue",
@"Palatino-Roman", @"Palatino Roman",
@"Verdana", @"Verdana", nil];
fontNameKeys = [[NSArray alloc] initWithObjects:
@"Baskerville",
@"Georgia",
@"Helvetica Neue",
@"Palatino Roman",
@"Verdana", nil];
}
- (void)dealloc {
[fonts release], fonts=nil;
[fontNameKeys release], fontNameKeys=nil;
[super dealloc];
}
iPad版创建并驳回UIPopoverController从而
- (void)displaySettingsPopover:(id)sender {
if([self.settingsPopover isPopoverVisible]) {
//close the popover view if toolbar button was touched again and popover is already visible
//Thanks to @chrisonhismac
[self.settingsPopover dismissPopoverAnimated:YES];
[self.settingsPopover.delegate popoverControllerDidDismissPopover:self.settingsPopover];
} else {
if (!self.settingsPopover) {
//build our custom popover view
PreferencesViewController_iPhone *pvc = [[PreferencesViewController_iPhone alloc] initWithNibName:nil
bundle:nil
callbackObject:self
selector:@selector(applySettingsFromPopover)];
[pvc.view setBackgroundColor:[UIColor lightGrayColor]];
[pvc.navigationItem setTitle:@"Preferences"];
[pvc setContentSizeForViewInPopover:CGSizeMake(320, 444)];
//create a popover controller
self.settingsPopover = [[UIPopoverController alloc] initWithContentViewController:pvc];
[pvc release];
self.settingsPopover.delegate = self;
}
//present the popover view non-modal with a
//refrence to the toolbar button which was pressed
[self.settingsPopover presentPopoverFromBarButtonItem:sender
permittedArrowDirections:UIPopoverArrowDirectionUp
animated:YES];
}
}
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController {
[self.settingsPopover setDelegate:nil];
[settingsPopover release];
settingsPopover=nil;
}
我不知道为什么的NSDictionary和NSArray泄漏为iPad而不是iPhone。 Profiler表示他们的保留数最初设置为1,但从不dealloc。
谢谢!
另外,您可能希望将该手动调用删除到委托。不应该这样做。 – 2011-05-25 05:44:39
如果没有该行,popoverControllerDidDismissPopover:在用户单击工具栏按钮关闭弹出窗口时不会被调用。只有在用户点击远离弹出窗口时才会调用它。也许有更好的方法来管理这个?我遵循另一篇文章的例子。 – TimN 2011-05-25 15:54:45