我有一個基於分割視圖控制器的應用程序。在詳細信息視圖控制器,稱之爲FirstViewController,當用戶按下一個按鈕,我更新了新的視圖控制器的視圖控制器,稱之爲SecondViewContorller,類似下面:釋放細節視圖控制器導致內存問題
- (void) buttonPressed:(id)sender {
UIViewController <SubstitutableDetailViewController> *detailViewController = nil;
SecondViewController *secondVC = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
...
detailViewController = secondVC;
MyAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
UINavigationController *nav = (UINavigationController *)[delegate.splitViewController.viewControllers objectAtIndex: 0];
NSArray *viewControllers = [NSArray arrayWithObjects:nav, detailViewController, nil];
self.splitViewController.viewControllers = viewControllers;
...
[detailViewController release];
}
裏面的SecondViewController,在某些時候,我們有:
MyAppDelegate *delegate = [[UIApplication sharedApplication] delegate];
UINavigationController *nav = (UINavigationController *)[delegate.splitViewController.viewControllers objectAtIndex: 0];
NSArray *array = nav.viewControllers;
// Retrieve the master view controller
MasterViewController *masterVC = [array objectAtIndex:[array count] - 1];
[masterVC selectRowManually:[NSIndexPath indexPathForRow:0 inSection:0]];
和selectRowManually裏面我再次初始化FirstViewController:
UIViewController <SubstitutableDetailViewController> *detailViewController = nil;
if (rowNo == 0) {
FirstViewController *newDetailViewController = [[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil];
detailViewController = newDetailViewController;
}
...
UINavigationController *nav = (UINavigationController *)[delegate.splitViewController.viewControllers objectAtIndex: 0];
// Update the split view controller's view controllers array.
NSArray *viewControllers = [[NSArray alloc] initWithObjects:nav, detailViewController, nil];
delegate.splitViewController.viewControllers = viewControllers;
[viewControllers release];
...
[detailViewController release];
如果我模擬內存將在該時間點警告(在FirstViewController已經再次顯示後),我得到一個
-[UIView _invalidateSubviewCache]: message sent to deallocated instance ...
與
#0 0x012dd057 in ___forwarding___
#1 0x012dcf22 in __forwarding_prep_0___
#2 0x00b49a55 in -[UIView dealloc]
#3 0x00bbe52a in -[UIViewController setView:]
#4 0x00bc0eec in -[UIViewController unloadViewForced:]
#5 0x00bbcb0a in -[UIViewController unloadViewIfReloadable]
#6 0x00bbc15b in -[UIViewController didReceiveMemoryWarning]
#7 0x0006aec7 in -[SecondViewController didReceiveMemoryWarning] at SecondViewController.m:385
...
,其中線385堆棧跟蹤是
[super didReceiveMemoryWarning];
如果在SecondViewController的buttonPressed方法中,我註釋了釋放該行的位置detailViewContorller,一切正常,但我泄漏內存。如果我以這種方式離開該線路,那麼如果出現內存警告,該應用會崩潰。
我該怎麼辦?
感謝, 米哈伊
感謝您的回答。 detailViewController對於該方法是本地的。在detailViewController = secondVC之後,兩者都指向相同的SecondViewController對象,因此釋放detailViewController或secondVC不應該有任何區別。 – 2011-01-26 16:13:04