2010-08-24 20 views
0

使用附錄I有兩個查詢存儲器[RAM實時]上勞克IPhone 4.0,然後使用的UIImageView

  1. 我正在運行其中具有單個視圖控制器在它實現的示例應用程序。當我使用儀器檢查內存時,它顯示3.66 MB 。想知道爲什麼它需要大量的RAM,因爲沒有什麼太多的應用程序。

  2. 當我加入的UIImageView與25 KB的具有尺寸圖像,然後內存採用去4.24 MB
    [我才知道背後的「圖像解壓縮320 * 480的原因* 4 = 580 KB「,但需要調試更多關於這個&它仍保留在緩存]

沿着這我還觀察到兩種情況

  1. 當我們使用api [UIImage imageNamed:aName]來加載圖像,然後調用[UIImageview release]沒有任何影響。

  2. 但是當我們使用

[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:aName ofType:nil]];

一些內存清理,當我打電話[UIImageview release]

在我的應用程序,我將用大量的圖片,這將導致內存不足,會導致應用程序崩潰。

請給我一些參考或路徑來分析爲什麼會出現這種行爲。

謝謝,

薩加爾

回答

2

試圖讓你的應用在內存中是一個失敗的遊戲。它會引導你找出你正在運行的設備類型的奇怪路徑,根據該設備交換資源等等。

更好的選擇是設計你的內存結構爲ditchability,然後支持一個相當苛刻的溝渠養生法,當你被告知低內存條件。繼續使用內存 - 它就是這樣 - 讓低內存警告成爲你的信號來刪除未使用的資源。

很多人似乎覺得他們的應用程序會產生內存警告。這很愚蠢。這裏的設計模式是,盡你所能地吃東西,但當你被告知你超重時,做出適當的反應。鑑於您正在使用各種各樣的內存配置文件(例如,iPhone 3G具有iPhone 4的1/4內存),所以最好的方法就是在您填充時記憶。

您遇到的主要障礙是從丟棄數據中恢復。我發現最好的辦法是明確地將UIImage對象設置爲nil,然後在使用它們之前測試nil,從bundle或網絡重新加載它們,或者在必要時重新加載它們。

所有這一切說:[UIImage imageNamed:]支持ditchability,但你不能控制它。當一個UIViewController子類獲得一個內存警告時,它會拋棄你用這個方法創建的緩存UIImages,但是你不能做的任何事情都會讓它們消失。即使給UIImage分配一個小東西也無濟於事,因爲它的緩存與名爲「Name」的「名稱」相關聯,而不是它分配給的對象。因此,這種方法對於要重複使用的圖像非常有用,但即使如此,當時間到了時它也會被修剪,並且您需要做出適當的響應。

+0

感謝Dan對此詳細的解釋。 當我們收到內存警告以避免任何奇怪的行爲時需要工作。 – 2010-08-24 12:25:59

0

圖像,裝載有imageNamed,在存儲器由UIKit的高速緩存,和圖像,裝載有imageWithContentsOfFile不是。

+0

然後如何實現一個場景,其中「UITableView將具有包含圖像的單元格,並且當我們終止該應用程序時釋放表格」,例如聊天中的在線和離線用戶列表,如應用程序。 – 2010-08-24 09:31:36

+0

如果您需要加載預定義圖標或少量圖像,請使用imageNamed。如果所有圖像都不相同,並且存在很多圖像(因此它們不適合內存)(即化身等),則可以更好地將它們動態加載到cellForRowAtIndexPath中,然後在[cell rellease]處理程序中釋放。 但是,這會影響性能。 – 2010-08-24 09:51:36

+0

感謝Nickolay的快速響應。它似乎與當前的工具,如果你正在實施這樣的應用程序與大量的圖像持有,那麼有很多的可能性,在低內存中移動。這個實現與可重用性衝突。 – 2010-08-24 10:20:53