2011-05-25 31 views
0

我有一个通用应用程序,其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。

谢谢!

+0

另外,您可能希望将该手动调用删除到委托。不应该这样做。 – 2011-05-25 05:44:39

+0

如果没有该行,popoverControllerDidDismissPopover:在用户单击工具栏按钮关闭弹出窗口时不会被调用。只有在用户点击远离弹出窗口时才会调用它。也许有更好的方法来管理这个?我遵循另一篇文章的例子。 – TimN 2011-05-25 15:54:45

回答

4

这条线泄漏:

self.settingsPopover = [[UIPopoverController alloc] initWithContentViewController:pvc]; 

如果您settingsPopoverretaincopy财产,retain是非常可能的。仔细检查一下,如果确实如此,自动释放它就像这样:

self.settingsPopover = [[[UIPopoverController alloc] initWithContentViewController:pvc] autorelease]; 
+0

谢谢,我会尝试。 – TimN 2011-05-25 14:57:44

+0

不幸的是,autorelease没有帮助。当弹出被解除/释放时,Dictionary和Array不会被释放。顺便说一下,我添加了一个NSLog()到dealloc:验证它是否在popover被释放时被调用,并且是。我怀疑我可以让这两个对象变为可变的,并在dealloc中删除它们的内容,但这似乎并不是必须的。 – TimN 2011-05-25 15:57:18

+0

此外,它们的@属性定义(如果有帮助) '@property(nonatomic,retain)NSDictionary * fonts; @property(nonatomic,retain)NSArray * fontNameKeys;' – TimN 2011-05-25 16:01:28