2011-10-20 55 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

相關問題