2011-05-25 85 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