2014-08-29 45 views
1

我的應用程序提供了帶圖像圖標的滾動按鈕列表。我發現,即使.png圖標文件只有2 kb,但它們的未壓縮版本大約爲150 kb,並且所有按鈕的總計使用的設備內存過多。帶圖像的UIButton的內存使用情況

本來每個按鈕是一個對象的實例中創建的,所以代碼基本上像這樣工作:

for (int i=0; i<buttonsCount; i++) { 
    UIImage *image = [UIImage imageNamed:@"Icon"]; 
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [button setImage:image forState:UIControlStateNormal]; 
} 

當我意識到有多少內存的圖像用,我搬到外面的影像創作對象並讓所有對象使用相同的圖像。所以現在代碼基本上是這樣工作的:

UIImage *image = [UIImage imageNamed:@"Icon"]; 

for (int i=0; i<buttonsCount; i++) { 
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [button setImage:image forState:UIControlStateNormal]; 
} 

但是,內存使用情況是相同的。顯然,UIButton正在製作自己的圖像數據副本。有沒有什麼辦法可以在許多按鈕之間「共享」圖像數據?

當我使用分配工具在樂器中運行應用程序時,「虛擬機:CG光柵數據」變得太大。

我能想到的唯一替代解決方案是在滾動時根據需要加載和卸載按鈕,但恐怕會傷害滾動性能;或者簡單地減小圖像的像素大小。

回答

0

你可以使用類似於UITableView的方法(或者直接使用UITableView)。它僅爲屏幕上的項目創建視圖(單元格),然後在這些單元格移出屏幕時再循環。這意味着這些視圖不會一直重新創建,只是在屏幕上移動之前纔會使用正確的數據進行更新。