2011-01-26 43 views
0

我有一個基於分割視圖控制器的應用程序。在詳細信息視圖控制器,稱之爲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,一切正常,但我泄漏內存。如果我以這種方式離開該線路,那麼如果出現內存警告,該應用會崩潰。

我該怎麼辦?

感謝, 米哈伊

回答

0

我很好奇你的代碼的第一個塊,你釋放你detailViewController代替secondVC?因爲您的第二個VC在該方法結束時未發佈。您應該在dealloc方法中釋放detailViewController,而不是在SplitViewAppDelegate中,因爲它是分割視圖的根視圖的一部分。

乾杯,希望它有幫助。

+0

感謝您的回答。 detailViewController對於該方法是本地的。在detailViewController = secondVC之後,兩者都指向相同的SecondViewController對象,因此釋放detailViewController或secondVC不應該有任何區別。 – 2011-01-26 16:13:04

相關問題