我有一個通用應用程序,其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