2010-11-25 71 views
2

我正在開發一個應用程序,它使用UIScrollView來顯示基於搜索條件的圖像列表。使用一個按鈕,用戶可以加載更多的圖像。iPhone內存管理,使我的應用程序crashind多個設備

當在iPhone 4上進行測試時,ViewController會在約750張圖像上收到內存警告。在第二代iPod上進行測試時,會收到約150張圖像的內存警告。

我的理解是,當調用didReceiveMemoryWarning時,可以通過釋放對象來釋放內存,但不能保證從低內存中恢復。

我實施了didReceiveMemoryWarning並釋放基本上所有的對象。在儀器中,我看到內存使用回落到〜3MB。 iPod第一次達到內存限制一切順利,內存被釋放,應用程序恢復正常運行。然而,第二次,當didReceiveMemoryWarning被調用時,我可以看到已發佈的對象,但是應用程序仍然崩潰。

那麼,如何讓我的應用程序崩潰證明?我想確保運行應用程序的所有設備都可以加載儘可能多的圖像,但是我也希望確保應用程序不會崩潰。

我更喜歡應用程序永遠不會觸及didReceiveMemoryWarning並設置可顯示圖像數量的限制,但是如何確定每個可能的設備應該能夠加載的圖像數量?

此外,圖像的大小不能保證。在測試中,我在iPod上達到了這個任意數量的150,但是如果服務器在某個時間點的圖像是兩倍大?然後,該應用程序可能會崩潰在75個圖像。

任何消耗?

回答

1

首先,您可能想要做的不是一次顯示所有圖像。你寧願,可能只想禁用當前可見的圖像,加上一些在用戶滾動到該位置時預先加載的屏幕。

這與照片應用程序的工作方式大致相同,UITableView如何實現。基本上它歸結爲:

你有你的主要滾動視圖,並在它裏面,你有單獨的單元格。這些單元格是小視圖,在特定的偏移處作爲子視圖添加到您的滾動視圖。然後,您將圖像添加到這些單元格。

當用戶滾動滾動視圖時,您首先要求滾動視圖爲您出列新的單元格,這與您要求表格視圖將單元出列以供您使用的方式大致相同。這節省了分配的成本,如果一個已被回收。如果你不能從一個回收集合中取出一個,那麼你必須做的很簡單:按照你現在正在做的分配一個。

此外,爲了實現這種細胞回收,您需要做的是查看哪些細胞在屏幕上可見。如果一個或多個單元格脫離屏幕,則將它們添加到您創建的再循環單元格NSSet。這套設備只保存細胞供以後回收。 Apple有一些示例代碼演示了這一點,它被稱爲PhotoScroller。它也在WWDC10視頻104會話中得到證明。我建議你看。忽略關於平鋪的部分,你不需要知道你的目的。

一旦你有了這個地方,這將迫使你只在需要的時候設置你的單元格,這也是此行爲的另一個關鍵方面。

最後,當您確實收到內存警告時,只需放棄回收的電池組即可。如果你足夠高以至於重要,就是說,你將會節省幾個記憶。 :)(不要忘了實現它,永遠,當你持有你並不需要的臨時數據時......屏幕上不可見的單元格就是一個很好的例子,就像緩存一樣。)

0

你應該懶加載你的圖片,只加載當時你需要的圖片。您的應用程序無法在一個屏幕上顯示所有這些圖像,因此在您的滾動視圖中,您應該只加載適合屏幕的圖像,可能還有一些圖像,並且隨着用戶滾動以釋放不再需要的圖像。