看看unloads和dealloc之后iPhone内存没有发布,为什么?

时间:2011-10-20 12:50:49

标签: iphone objective-c memory-management

我已经在我的iPhone应用程序中苦苦挣扎了几周,尽管在线进行了全面的研究,但我们还是无法解决这个问题。

以下是这种情况: 我的应用程序与Google AnalyticsAPI进行通信,并基于3种基本视图:主视图,设置视图和提供谷歌数据(带有自定义单元格)的tableview视图。我还构建了一个自定义类,从谷歌中获取数据,然后在完成后自行杀死。所有数据都存储在singelton数据中心。

所有视图均已启动,然后按如下方式发布:

if (self.vVisitsTabelView == nil) {
    visitsTabelView *initiatevisitsTabelView = [[visitsTabelView alloc]     initWithNibName:@"visitsTabelView" bundle:nil];
    self.vVisitsTabelView = initiatevisitsTabelView;
    [initiatevisitsTabelView release];
}

[self.navigationController  pushViewController:vVisitsTabelView animated:YES];
[vVisitsTabelView release];
vVisitsTabelView = nil;

问题在于,每次加载视图内存都会增加,但是当弹出视图时,虽然调用了dealloc并且正在释放所有实例变量,但它不会释放内存。这个循环重复发生(同时重新加载相同的视图)并且内存消耗变得非常高。在要求使用后,我甚至获得了200mb真实内存和320个虚拟仪器。奇怪的是,只收到一次内存警告,但我的应用程序从未因内存不足而崩溃,仪器显示没有泄漏。

进入后台后,内存正在缓慢释放并被其他应用程序使用,但是当我返回前台时,内存将被回收到进入后台之前的级别(可能形成虚拟内存?)。此过程需要9秒,在此期间应用程序将被冻结。

任何想法如何攻击这种情况?我到处搜索并仔细遵循所有准则。

任何领导都非常感谢......

如果我没有遵循指导原则,请原谅,这是我第一次来到这个美好的地方。

2 个答案:

答案 0 :(得分:2)

  

谢谢,你能详细说明怎么做吗?

是;你有内存泄漏。现在,Leaks仪器可能会或可能不会告诉您什么是泄漏。它不会检测仍以某种方式连接到应用程序其余部分的对象;即如果对象的引用保留在应用程序仍在使用的某个NSMutableDictionary中,则不会被检测到。

既然你确切地知道哪个对象被泄露了,那就是找出保留它的东西,但不释放它。分配工具提供了这种能力。具体而言,您可以配置分配工具以跟踪保留计数。

本文可能对http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/有帮助。

此外,SO上有许多非常相似的问题/答案可以解决这个问题。在过去的几个星期里,我找不到一个很好的图画教程,说明如何做到你想要的。

答案 1 :(得分:-3)

您是否检查过您的观点的保留计数? [theView retainCount]会这样做。

无论哪种方式,你都应该强烈考虑转向适用于iOS5的ARC。你应该能够告别所有的记忆管理困境。