2011-10-20 58 views
1

自从周以来,我一直在iphone应用程序中遇到内存问题,尽管在线进行了全面的研究,但仍无法解决问题。查看卸载和dealloc后未释放iPhone内存,为什么?

以下是案例: 我的应用程序与Google AnalyticsAPI进行通信,它基于3个基本视图:主视图,设置视图和显示谷歌(带有自定义单元格)数据的tableview视图。我还构建了一个自定义类,用于从Google获取数据,然后在完成时自行终止。所有数据都存储在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秒钟的时间,应用程序被冻结。

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

任何铅的高度赞赏...

请原谅我,如果我没有遵守的准则,这是我第一次在这个美妙的地方。

回答

-3

您是否检查过您的视图上的保留计数? [theView retainCount]将执行此操作。

无论采用哪种方式,您都应该强烈考虑转移到适用于iOS5的新版ARC。你应该能够告别所有的内存管理困境。

+0

非常感谢您的快速回复...将移动到ARC效果旧的IOS版本兼容性?可以说IOS 3.3? – Sheni

+0

ARC只能在iOS 4.3及更高版本上使用,因此您不得不放弃对iOS3和较早版本iOS4的支持。 –

+3

retainCount没用。使用分配工具确定保留但未释放对象的内容。 – bbum

2

谢谢,你能稍微详细说一下怎么做吗?

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

由于您确切知道哪个对象正在泄漏,因此需要弄清楚保留它的内容,但不会将其释放。 Allocations仪器完全提供了这种功能。具体而言,您可以配置分配工具来跟踪保留计数。

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

另外,SO上有很多非常相似的问题/答案来解决这个问题。在过去的几周里,有一个我无法找到,它给出了一个很好的图画教程,告诉你如何去做你想要的东西。

+0

谢谢!你现在已经为我提供了一些周末计划;) – Sheni

相关问题