2012-06-11 50 views
0

該項目目前有一個名爲「Dashboard」的UIviewController,它充當所有應用程序的主視圖。這個主視圖由兩個子視圖組成,有點像分割視圖。主(左視圖)的左側有多個按鈕。右側(右側視圖)將顯示左側選定按鈕的內容。具有多個視圖的UIViewcontroller

當按鈕被按下它會創建一個要顯示這樣的觀點的一個新實例:

vcMySchedule_iPad *vcSchedule = [[vcMySchedule_iPad alloc] initWithNibName:@"vcMySchedule_iPad" bundle:nil]; 
ncDashboard = [[UINavigationController alloc] initWithRootViewController:vcSchedule]; 

ncDashboard.navigationBar.barStyle = UIBarStyleBlackOpaque; 

ncDashboard.view.frame = self.vwRightPanel.bounds; 

[self.vwRightPanel addSubview:ncDashboard.view]; 

的事情是,按下另一個按鈕時會顯示另一種觀點,但內存前一個視圖的dealloc仍然保留,前一個視圖的dealloc永遠不會被調用。

我沒有使用分割視圖,因爲左側有一個按鈕,當推送它時,它將左側移動到左側,右側移動左側以完全查看。

有沒有辦法呢?

一些圖像更新...

主要(MainViewController): enter image description here

壓制課程目錄:

vcCourseCatalog_iPad *vcCourse = [[vcCourseCatalog_iPad alloc] initWithNibName:@"vcCourseCatalog_iPad" bundle:nil]; 
ncDashboard = [[UINavigationController alloc] initWithRootViewController:vcCourse]; 

ncDashboard.navigationBar.barStyle = UIBarStyleBlackOpaque; 

ncDashboard.view.frame = self.vwRightPanel.bounds; 

[self.vwRightPanel addSubview:ncDashboard.view]; 

enter image description here

當選擇行形成表它顯示細節,如果用戶按下按鈕,視圖顯示爲最大。

enter image description here

我想我可能一直在呼籲新的觀點錯了也許。物體在哪裏發佈?

回答

0

沒有更多的信息,我不能給可靠的建議,但檢查以下內容:

  1. 是否使用ARC?如果不是,請記住,在解除分配之前,您必須顯式釋放所有引用。
  2. 你是否在其他地方保留對子視圖的引用?如果你仍然在某處(特別是在ARC)引用它,它會堅持下去。循環引用在這裏是邪惡的。
  3. 你是否從它的超級視圖中刪除子視圖,然後用新視圖替換它?你會很驚訝,這是多麼的簡單。

編輯:

在回答下面,你不能使用ARC,它顯然是明顯的:1)是你的問題。你沒有發佈引用。在這種情況下,它似乎很明顯的位置:

vcCourseCatalog_iPad *vcCourse = [[vcCourseCatalog_iPad alloc] initWithNibName:@"vcCourseCatalog_iPad" bundle:nil]; ncDashboard = [[UINavigationController alloc] initWithRootViewController:vcCourse]; 

ncDashboard.navigationBar.barStyle = UIBarStyleBlackOpaque; 

ncDashboard.view.frame = self.vwRightPanel.bounds; 

[self.vwRightPanel addSubview:ncDashboard.view]; 

您分配vcCourseCatalog_iPadUINavigationController,從來沒有釋放他們。理想情況下,您將自動釋放vcCourseCatalog_iPad,並在您將其交換出來時釋放導航控制器。

你的代碼應該是這個樣子:

vcCourseCatalog_iPad *vcCourse = [[[vcCourseCatalog_iPad alloc] initWithNibName:@"vcCourseCatalog_iPad" bundle:nil] autorelease]; 

if(ncDashboard) 
{ 
    //do any sort of removal from views here 
    //[ncDashboard.view removeFromSuperview]; 
    [ncDashboard release]; 
} 
ncDashboard = [[UINavigationController alloc] initWithRootViewController:vcCourse]; 
ncDashboard.navigationBar.barStyle = UIBarStyleBlackOpaque; 
ncDashboard.view.frame = self.vwRightPanel.bounds; 

[self.vwRightPanel addSubview:ncDashboard.view]; 
+0

我沒有使用ARC。我使用名爲「removeViewsFromRight」的主視圖中的方法刪除視圖。由於用戶可以按下左窗格中的任何按鈕,我必須從主視圖中刪除視圖。 – Angie

+0

在這種情況下,它非常簡單 - 正如我在1)中提到的那樣,在創建它們之後,您不會釋放它們。當您創建vcCourseCatalog_iPad時,它的保留計數爲1.然後將它傳遞給UINavigationController,UINavigationController在內部存儲對其的引用,將保留計數增加到兩個。當涉及UINavigationController時,它釋放vcCourseCatalog_iPad,給它一個保留計數1,你永遠不會擺脫因爲沒有引用它。如果你自動釋放vcCourseCatalog_iPad,那麼它將被正確處理。 – CrimsonDiego

+0

謝謝你的所有幫助。知道我理解得更好。 – Angie

0

此外,以CrimsonDiego的答案,我建議您使用您的文件如下線路:

.h文件:

@property (nonatomic, retain) UIView *ncDashBoard; 

.m文件:

@synthesize ncDashBoard = _ncDashBoard; 

然後用_ncDashBoard只從那時起。這是爲了確保保留計數設置正確。

+0

ott,謝謝你的提示。 – Angie

相關問題