3 回答

TA貢獻1802條經驗 獲得超10個贊
這取決于您對圖像的處理方式。該imageNamed:
方法確實緩存了圖像,但是在許多情況下將有助于內存使用。例如,如果您加載一張圖像10次以在表視圖中與某些文本一起顯示,則UIImage將僅在內存中保留該圖像的單個表示,而不分配10個單獨的對象。另一方面,如果圖像很大,并且您不打算重新使用它,則可能要從數據對象加載圖像,以確保完成后從內存中將其刪除。
如果您沒有任何大圖像,那我就不用擔心。除非您遇到問題(并且為了檢查對象分配而不是先發制人地優化),否則我會選擇較少的代碼行,而忽略可以忽略的內存改進。

TA貢獻1993條經驗 獲得超6個贊
正如UIImage的API參考所說:
+(UIImage *)imageNamed:(NSString *)name
此方法在系統緩存中查找具有指定名稱的圖像對象,并返回該對象(如果存在)。如果緩存中還沒有匹配的圖像對象,則此方法從指定的文件加載圖像數據,將其緩存,然后返回結果對象。
+(UIImage *)imageWithContentsOfFile:(NSString *)路徑
此方法不緩存圖像對象。
因此,我們可以看到,如果您有很多相同的UI元素(例如UITableViewCell)可能使用相同的圖像(通常作為圖標使用),并且由于性能原因,我們當然想重用同一圖像,這樣我們將為其他用途節省一些內存。通常,重用的圖像通常在ui元素中使用,我們的用戶可能會對其進行很多次操作。因此它對于我們重用它很有價值。因此,您可以選擇使用imageNamed方法。
另一方面,在應用程序中,在應用程序的生命周期中將存在一些UI元素,例如Button,徽標視圖,因此這些ui元素使用的這些圖像也可能在應用程序的過程中存在。在生命周期中,您無需考慮是否應緩存這些圖像。因此,您可以選擇使用imageNamed方法。
相反,在應用程序中,通常會動態創建一些UI元素。例如,我們的應用程序支持動態背景,以便用戶可以選擇自己喜歡的背景。并且背景可以是圖像。因此,我們可能有一個界面,其中列出了許多不同的背景(通常使用UIImageView進行顯示)供用戶選擇,我們可以將列表視圖命名為MyBackgroundListView。因此,一旦用戶選擇了背景圖片,則MyBackgroundListView應該被銷毀,因為它已完成其功能。下次用戶想要更改其背景時,我們可以創建再次使用MyBackgroundListView。因此,不應緩存MyBackgroundListView使用的圖像,否則我們的應用程序的內存將用完。因此,這一次您應該使用 imageWithContentsOfFile方法。
正如蘋果公司支持Views中高分辨率屏幕的文檔所說
在具有高分辨率屏幕的設備上,imageNamed:,imageWithContentsOfFile:和initWithContentsOfFile:方法會自動在名稱中使用@ 2x修飾符查找所請求圖像的版本。如果找到一個,它將加載該圖像。如果不提供給定圖像的高分辨率版本,則該圖像對象仍會加載標準分辨率的圖像(如果存在)并在繪制過程中對其進行縮放。
因此您會擔心圖像的搜索路徑是否存在視網膜屏幕問題。IOS將幫助您處理它。
對不起,我英語不好??赡軙兴鶐椭?。

TA貢獻1815條經驗 獲得超13個贊
如果您不希望圖像被緩存,也可以直接使用initWithContentsOfFile:
NSString *fileLocation = [[NSBundle mainBundle] pathForResource:fileName ofType:extension];
UIImage* yourImage = [[[UIImage alloc] initWithContentsOfFile:imagePath] autorelease];
- 3 回答
- 0 關注
- 726 瀏覽
添加回答
舉報