Ipad UIPopoverController内存泄漏
我有一个通用应用程序,其iPad部分使用UIPopoverController,它显示与iPhone部分共享的UIViewController。当iPhone版本加载并释放view控制器时,一切正常(无内存泄漏)。当iPad版本加载它时,两个条目,一个NSDictionary和一个NSArray泄漏 在视图控制器中,两个对象被创建并释放Ipad UIPopoverController内存泄漏,ipad,ios4,nsarray,nsdictionary,uipopovercontroller,Ipad,Ios4,Nsarray,Nsdictionary,Uipopovercontroller,我有一个通用应用程序,其iPad部分使用UIPopoverController,它显示与iPhone部分共享的UIViewController。当iPhone版本加载并释放view控制器时,一切正常(无内存泄漏)。当iPad版本加载它时,两个条目,一个NSDictionary和一个NSArray泄漏 在视图控制器中,两个对象被创建并释放 - (void)setupModels { fonts = [[NSDictionary alloc] initWithObjectsAndKeys:
- (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。探查器表示,他们的保留计数最初设置为1,但从未解除锁定
谢谢 此管线泄漏:
self.settingsPopover = [[UIPopoverController alloc] initWithContentViewController:pvc];
如果您的settingsPopover
是retain
或copy
属性,则很可能是retain
。再次检查,如果确实如此,请按如下方式自动释放:
self.settingsPopover = [[[UIPopoverController alloc] initWithContentViewController:pvc] autorelease];
该管线泄漏:
self.settingsPopover = [[UIPopoverController alloc] initWithContentViewController:pvc];
如果您的settingsPopover
是retain
或copy
属性,则很可能是retain
。再次检查,如果确实如此,请按如下方式自动释放:
self.settingsPopover = [[[UIPopoverController alloc] initWithContentViewController:pvc] autorelease];
另一方面,您可能希望删除对代理的手动调用。不应该这样做。如果没有该行,当用户单击工具栏按钮关闭popover时,不会调用PopOvercontrollerdDismissPopover:。它仅在用户单击popover以外的位置时调用。也许有更好的方法来处理这个问题?我遵循了另一篇文章中的一个例子。作为旁白,您可能希望删除对代理的手动调用。不应该这样做。如果没有该行,当用户单击工具栏按钮关闭popover时,不会调用PopOvercontrollerdDismissPopover:。它仅在用户单击popover以外的位置时调用。也许有更好的方法来处理这个问题?我遵循了另一篇文章中的一个例子。不幸的是,自动释放没有帮助。当popover被解除/释放时,字典和数组不会被释放。顺便说一句,我在dealloc中添加了一个NSLog():以验证在发布popover时是否正在调用它,并且它是。我怀疑我可以使这两个对象变为可变的,并删除它们在dealloc中的内容,但这似乎不是必需的。此外,它们的@property定义是(如果有用的话)
@property(非原子,保留)NSDictionary*字体@属性(非原子,保留)NSArray*FontNameKey代码>我在这个问题上发现了更多。造成泄漏的不是爆米花的关闭,而是爆米花的打开。也就是说,如果我打开popover并让它打开足够长的时间,以便探查器创建它的快照,我会看到字典和数组的泄漏。然后,听起来好像您多次调用setupModels
。不幸的是,自动释放没有帮助。当popover被解除/释放时,字典和数组不会被释放。顺便说一句,我在dealloc中添加了一个NSLog():以验证在发布popover时是否正在调用它,并且它是。我怀疑我可以使这两个对象变为可变的,并删除它们在dealloc中的内容,但这似乎不是必需的。此外,它们的@property定义是(如果有用的话)@property(非原子,保留)NSDictionary*字体@属性(非原子,保留)NSArray*FontNameKey代码>我在这个问题上发现了更多。造成泄漏的不是爆米花的关闭,而是爆米花的打开。也就是说,如果我打开popover并让它打开足够长的时间,以便探查器创建它的快照,我会看到字典和数组的漏洞。然后听起来像是您多次调用setupModels
。