亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

[UIImage imageNamed…]和[UIImage imageWithData…]

[UIImage imageNamed…]和[UIImage imageWithData…]

iOS
森欄 2019-12-12 13:51:54
我想從文件系統將一些圖像加載到我的應用程序中。有兩種簡單的方法可以做到這一點:[UIImage imageNamed:fullFileName]要么:NSString *fileLocation = [[NSBundle mainBundle] pathForResource:fileName ofType:extension];NSData *imageData = [NSData dataWithContentsOfFile:fileLocation];[UIImage imageWithData:imageData];我喜歡第一個,因為它的代碼少得多,但是我看到有人說圖像被緩存了,并且這種方法使用了更多的內存?由于我不信任其他大多數論壇上的人,因此我想在這里問這個問題,在實際上是否有區別,如果可以,那么哪個更好?我嘗試使用對象分配工具對應用程序進行性能分析,盡管我只是在模擬器中進行了嘗試,而沒有在iPhone本身上進行過嘗試,但我看不出任何實際的區別。
查看完整描述

3 回答

?
守候你守候我

TA貢獻1802條經驗 獲得超10個贊

這取決于您對圖像的處理方式。該imageNamed:方法確實緩存了圖像,但是在許多情況下將有助于內存使用。例如,如果您加載一張圖像10次以在表視圖中與某些文本一起顯示,則UIImage將僅在內存中保留該圖像的單個表示,而不分配10個單獨的對象。另一方面,如果圖像很大,并且您不打算重新使用它,則可能要從數據對象加載圖像,以確保完成后從內存中將其刪除。

如果您沒有任何大圖像,那我就不用擔心。除非您遇到問題(并且為了檢查對象分配而不是先發制人地優化),否則我會選擇較少的代碼行,而忽略可以忽略的內存改進。


查看完整回答
反對 回復 2019-12-12
?
ibeautiful

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將幫助您處理它。


對不起,我英語不好??赡軙兴鶐椭?。


查看完整回答
反對 回復 2019-12-12
?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

如果您不希望圖像被緩存,也可以直接使用initWithContentsOfFile:


NSString *fileLocation = [[NSBundle mainBundle] pathForResource:fileName ofType:extension];

UIImage* yourImage = [[[UIImage alloc] initWithContentsOfFile:imagePath] autorelease];


查看完整回答
反對 回復 2019-12-12
  • 3 回答
  • 0 關注
  • 726 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號