0

该项目目前有一个名为“Dashboard”的 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 永远不会被调用。

我没有使用拆分视图,因为左侧有一个按钮,当按下时它将左侧移动到左侧,右侧将左侧移动以完全查看。

有什么办法吗?

更新了一些图片...

主要(MainViewController): 在此处输入图像描述

压制课程目录:

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];

在此处输入图像描述

当从表格中选择一行时,它会显示详细信息,如果用户按下按钮,则视图将显示为最大。

在此处输入图像描述

我想我可能一直认为新观点是错误的。释放的对象在哪里?

4

2 回答 2

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];

您正在分配 avcCourseCatalog_iPad和 a UINavigationController,而从未释放它们。理想情况下,您会自动释放 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];
于 2012-06-11T16:04:27.320 回答
0

除了 CrimsonDiego 的回答,我建议您在文件中使用以下行:

.h文件中:

@property (nonatomic, retain) UIView *ncDashBoard;

.m文件中:

@synthesize ncDashBoard = _ncDashBoard;

然后_ncDashBoard只从那时起使用。这是为了确保正确设置保留计数。

于 2012-06-11T19:32:52.970 回答