Ipad UIPopoverController内存泄漏

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:

我有一个通用应用程序,其iPad部分使用UIPopoverController,它显示与iPhone部分共享的UIViewController。当iPhone版本加载并释放view控制器时,一切正常(无内存泄漏)。当iPad版本加载它时,两个条目,一个NSDictionary和一个NSArray泄漏

在视图控制器中,两个对象被创建并释放

- (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