2012-04-01 40 views
0

我收到兩條內存警告。它不顯示警告級別。它顯示簡短的短語:我收到內存警告,我的應用程序崩潰。它會殺死autorelease對象嗎?

Received memory warning. 
Received memory warning. 

我收到內存警告,幾秒鐘後我的應用程序崩潰。我的應用程序崩潰了,因爲我收到了內存警告?

我知道內存警告級別2 killes autorelease對象。沒有任何級別指示的內存警告是否會終止autorelease對象?

回答

1

自動釋放對象並不總是立即釋放

例如...如果你有一個循環,你的Alloc了很多自動釋放的物體上,不會得到釋放,直到循環結束......所以,如果它們大小,你可以得到內存警告和應用程序崩潰之前的循環結束大,他們有機會得到釋放

如果這個..just alloc和發行對象自己來管理內存的問題

+0

在ARC,我們無法釋放自己,所以我們可以用零來代替釋放? – Rajneesh071 2013-05-20 12:23:10

+0

實際上,如果您從ARC中排除文件,您可以自己釋放對象。對於類中的其他對象,您可以自己調用autorelease(而不是自動) – skytz 2013-05-21 15:29:15

+0

但我想使用ARC,因此如何在ARC中釋放我們的對象, – Rajneesh071 2013-05-22 05:03:15

2

你在使用MRC嗎?在這種情況下,當收到內存警告時,將調用dealloc方法來釋放所有必要的視圖和對象以釋放一些內存。

檢查是否在dealloc中正確釋放了所有內容。

當您的應用程序超出其範圍時,會自動釋放自動釋放對象。

0
  1. 使用虛擬內存 iOS不使用交換文件,但它確實支持虛擬內存。如果應用程序在內存中保留大量數據以進行隨機訪問(如字母塊3D中的詞彙表),則需要將其組織爲映射文件,而不是將其裝載到RAM中,然後使用malloc() 將其加載到RAM中。要做到這一點的最簡單的方法是調用 NSData的initWithContentsOfMappedFile:

  2. 不得堆放自動釋放對象 當實例像NSString對象與他們住,直到你的自動釋放池釋放沒有明確的分配 - 通常直到你的應用程序退出。廣泛使用這些技術可能會導致RAM中出現大量垃圾。使用 NSString initWithContentsOfFile: 因此您可以稍後釋放它而不是 NSString stringWithContentsOfFile: 。同樣的規則適用於 UIImage imageNamed: - 這不建議用於圖像加載。

  3. 處理內存警告 處理內存警告時卸載不必要的資源。即使你不能卸載你的任何東西,請在你的所有UIViewControllers中調用 [super didReceiveMemoryWarning] 。這將在默認情況下釋放一些資源,如非前視圖上的UI控件。未能處理此事件可能會使iOS認爲您的應用程序值得查殺。

  4. 考慮限制使用動畫視圖轉換 注意動畫如翻轉轉換會在執行時導致RAM使用率峯值。此功能非常整潔,應該在許多情況下使用,但可能會在重負載的多任務環境中觸發內存警告。特別是我們強烈建議避免OpenGL視圖的動畫。

  5. 測試設備上的內存佔用情況 使用儀器進行測試。最有用的工具是分配,泄漏和活動監視器。在大多數情況下,在模擬器上進行測試並不相關,因爲其內存佔用情況往往完全不同。一旦你測試你可以找出你的應用程序的每個部分使用多少內存,哪些是瓶頸以及如何優化。

來源:http://surgeworks.com/blog/lab-mobile/iphone/5-tips-to-reduce-memory-issues-in-ios-apps

相關問題