2010-11-01 48 views
0

我已經創建了一個應用程序,它有一個圖像庫。我已經將圖像導入到Xcode中的資源文件夾中,並且當應用程序加載時,它們當前將它們加載到appDelegate中的數組中。每次都發生這種情況。我現在擔心,隨着圖書館的發展,應用程序將耗盡內存。有沒有更好的方法來加載這些?加載iphone nsmutablearray圖像庫的最佳方式(600+項目)

結構是

庫>類別>圖像列表>圖像

我有一個NSMutableArray稱爲mainLibrary我然後添加另一NSMutableArray的每個類別。例如,

NSMutableArray *arrHome = [[NSMutableArray alloc] initWithObjects: @"Home",       
    [NSDictionary dictionaryWithObjectsAndKeys: [NSString stringWithFormat:@"%@/%@", resourcePath, @"alarm_clock.png"], @"image_path", @"Alarm Clock", @"title", nil], 
    [NSDictionary dictionaryWithObjectsAndKeys: [NSString stringWithFormat:@"%@/%@", resourcePath, @"bathtub.png"], @"image_path",@"Bathtub", @"title", nil], 

    nil]; 
[mainLibrary addObject: arrHome]; 

以上是針對「家庭」類別,並且只包含兩個圖像。對於其他類別,每個圖像都有NSDictionary行 - 每個類別最多可以有100個圖像。

如果我將50MB圖像加載到數組中,這會導致應用程序無響應 - 或者更可能是因爲它使用了更多每個應用程序的24mb(ish)配額而導致崩潰?

我想知道是否應該執行上面的代碼並讀入數組一次選擇了一個類別 - 但這可能會導致它失去用戶。

有什麼想法?

ps)我還需要對Retina顯示器有一個想法。 600多個圖像,複製它們意味着我的二進制大小會火箭!

回答

1

使用字符串組合您的路徑字典/數組,然後根據需要加載/卸載圖像(延遲加載),如果您需要這樣的結構在程序中進行對接。

600個HQ圖像將超出內存限制,這是浪費的,因爲用戶會看到在給定時間有多少這些圖像?資源相當有限,而hq圖像需要大量的空間。

如果您必須顯示一堆縮略圖,那些縮略圖可能會縮小並導出足夠容易,這樣您可以在合理的時間內顯示所有圖像,同時使用合理數量的內存(同樣,只需加載可能並在不太容易查看時釋放圖像)。

+0

謝謝 - 我認爲,我正確地做到了。這些數組被設置爲字符串 - 只有當我需要圖像時,我纔會說「爲objectatindex:X繪製圖像」。我主要關心的是數組花費時間來填充 - 基本上有600行來填充庫數組 - 然後保留以供以後使用。這種做法行得通嗎?非常感謝。 – 2010-11-01 10:49:50

+0

以這種方式創建600個字符串不應該花費太長時間,而且如果它在分析中顯示的話,減少它的方法並不是非常困難。我會使用'initWith ...'方法來處理這個大小的集合。這實際上是一個優化,因爲它會減少函數中消耗的最大內存,並且會減少autorelease池中的工作量。除此之外,您可以創建一個代表resourcePath,imagePath和title的NSObject子類,而不是使用字典。 – justin 2010-11-01 11:08:25

0

爲什麼不直接使用[UIImage imageNamed:IMAGE_NAME]?它內部有一個很好的內存管理。

+0

本來我確實有這個,但我使用相機拍照,並允許用戶使用 - 我認爲,因爲我正在保存路徑,我不得不使用init從路徑方法? – 2010-11-01 09:46:59

+0

-imageNamed將緩存圖像,所以它會減少加載時間。當接收到內存警告時,它會釋放它保存的內存。 Joshpaul提供有關執行時間的良好信息。 – AechoLiu 2010-11-01 23:08:05

2

前段時間我爲我正在開發的應用程序運行了一些測試。加載5000張圖片陸續:

[UIImage imageWithData:...] //44.8秒

[UIImage imageWithContentsOfFile:...] //52.3秒

[[UIImage alloc] initWithContentsOfFile:…] //351.8秒

[UIImage imageNamed:...] //掛着由於緩存

使用文件路徑顯然是最佳選擇。顯然,內存管理將是你的案例的關鍵。