Iphone 运行应用程序时,内存消耗不断增加

Iphone 运行应用程序时,内存消耗不断增加,iphone,objective-c,cocoa-touch,Iphone,Objective C,Cocoa Touch,我的应用程序中有多个视图,每个视图都有各自的视图控制器。我正在做的事情如下 下面是更具说明性的代码: - (void)applicationDidFinishLaunching:(UIApplication *)application { View1Controller *viewController1 = [[View1Controller alloc] initWithnibName:@"View1"]; View2Controller *viewController2 = [[Vi

我的应用程序中有多个视图,每个视图都有各自的视图控制器。我正在做的事情如下

下面是更具说明性的代码:

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
  View1Controller *viewController1 = [[View1Controller alloc] initWithnibName:@"View1"];
  View2Controller *viewController2 = [[View2Controller alloc] initWithnibName:@"View2"];
  View3Controller *viewController3 = [[View3Controller alloc] initWithnibName:@"View3"];

  [window addSubview:viewController1.view];
  [window makeKeyAndVisible];
}
在View1控制器文件中:

一些按钮动作

- (IBAction) goTOView2:(id)sender
{
  iPhoneApplicationAppDelegate *appDelegate = (iPhoneApplicationAppDelegate*) [[UIApplication sharedApplication] delegate];
  [appDelegate.window.superView removeFromSuperview];
  [appDelgate.window addSubview: appDelgate.viewController2.view];
}
与view3类似

我将所有这三视图控制器保留在我的应用程序委托中。当我想切换到其他视图时,我有以下代码

不要继续讨论代码的语法错误

此三视图控制器具有多个视图,具有自己的导航控制器,用于推送和弹出不同的视图

我的问题是,当我使用这个工具运行这个应用程序时,我看到当我从一个视图切换到另一个视图时,内存消耗不断增加


请提前提供帮助并对此表示感谢。

在应用程序窗口中添加和删除视图不是在视图控制器之间切换的推荐方式。您应该使用UITabBar并让UITabBarController处理视图控制器

内存消耗不断增加这一事实意味着在应用程序运行时分配更多的对象。这可能与你交换观点的方式无关。您很可能正在分配对象,而忘记释放它们,从而导致内存泄漏。您应该尝试在仪器中使用泄漏工具来确定哪些代码行导致了您的问题。(或在此处发布更多信息!)

在内存缓慢增长的情况下,“泄漏”工具通常没有帮助,这些通常不是泄漏,而是意外保留的对象

在对象分配工具中,选择“已创建且仍处于活动状态”选项

然后,在图形中选择一个区域,在该区域中,您可以看到正在使用更多内存,而您预期不会创建新内存。按照该信息查看创建您不期望的对象的内容

另外,您说您正在将这些视图控制器设置为属性。因此,这意味着您在ApplicationIDFinishLaunching中的设置与此完全相同:

self.viewController1 = viewController1;
对吗?

这行看起来不对:

[appDelegate.window.superView removeFromSuperview];
您想要的是:

[viewController1.view removeFromSuperview];

取决于您要离开的视图。

我认为需要更多的周围代码才能看到问题;我想也许你责怪视图控制器有点草率。同意。另外,请重新格式化您的代码,以使其更易于阅读。听起来您的代码中的某些内容可能会一直调用构造函数(将另一个对象/实例添加到内存中),而不会释放要替换的对象/实例。我们需要更多地了解周围的代码。在这种情况下,我会在运行仪表工具时看到内存泄漏,而我不是。我正在使用内存泄漏工具,并且没有泄漏。另外,当我切换到一个视图并返回到前一个视图时,它必须显示与之前相同的内存,但事实并非如此,实际上内存再次增加。内存泄漏由我为整个应用程序检查的红色棱锥表示,其中没有泄漏。您的代码示例显示了在ApplicationIDFinishLaunching:函数中作为局部变量创建的三个视图控制器。是否每次切换视图时都分配视图控制器的新实例?在某种程度上,当您认为正在使用旧的视图时,您似乎正在分配视图的新副本。不,我正在将所有viewController变量设置为@property(非原子,保留)。因此,我只需在调用对象时创建它们一次,然后使用view属性将各个视图添加为子视图。当我们使用addSubview方法添加它们时,它会创建一个新副本吗。另外,如果我分配了一些东西而没有释放它们,你不认为这会给我的仪器工具带来漏洞吗?是的,我正按照你说的那样做,但我也释放了viewController1。表示View1Controller*aViewController=[[View1Controller alloc]initwithNib:@“View1”];self.viewController1=aViewController;[aViewController释放];我做了更多的研究,发现泄漏来自quartzcore方面,正如我在下面问题的图片中所示。你真的应该把这个图形添加到这个问题上,你可以在这里返回并编辑原始问题。。。此外,图形的输出对任何人都没有意义,因为您没有标记“created and Stilling living”,因此无法从正确释放的项中判断该列表中的内存使用情况。你在视图控制器上所做的发布很好。这是我在开始时所做的,但后来我想,我可能正在删除已删除的视图。因此我使用了该部分。我以前的代码类似于[appDelegate.viewControoler1.view removeFromSuperview];但它仍然不影响内存消耗部分。我想问一下导航控制器的弹出和推送是否会影响堆栈中的内存。我认为我的问题是,视图堆栈不是空的,而是视图彼此添加,而不是从堆栈中删除。因为消耗的内存由石英核心部件显示。