2012-06-11 52 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

相关问题