我已经在我的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秒,在此期间应用程序将被冻结。
任何想法如何攻击这种情况?我到处搜索并仔细遵循所有准则。
任何领导都非常感谢......
如果我没有遵循指导原则,请原谅,这是我第一次来到这个美好的地方。
答案 0 :(得分:2)
谢谢,你能详细说明怎么做吗?
是;你有内存泄漏。现在,Leaks仪器可能会或可能不会告诉您什么是泄漏。它不会检测仍以某种方式连接到应用程序其余部分的对象;即如果对象的引用保留在应用程序仍在使用的某个NSMutableDictionary中,则不会被检测到。
既然你确切地知道哪个对象被泄露了,那就是找出保留它的东西,但不释放它。分配工具提供了这种能力。具体而言,您可以配置分配工具以跟踪保留计数。
此外,SO上有许多非常相似的问题/答案可以解决这个问题。在过去的几个星期里,我找不到一个很好的图画教程,说明如何做到你想要的。
答案 1 :(得分:-3)
您是否检查过您的观点的保留计数? [theView retainCount]会这样做。
无论哪种方式,你都应该强烈考虑转向适用于iOS5的ARC。你应该能够告别所有的记忆管理困境。