第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

[UIImage imageNamed…]和[UIImage imageWithData…]

[UIImage imageNamed…]和[UIImage imageWithData…]

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

3 回答

?
守候你守候我

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊

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

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


查看完整回答
反對 回復(fù) 2019-12-12
?
ibeautiful

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個(gè)贊

正如UIImage的API參考所說:


+(UIImage *)imageNamed:(NSString *)name


此方法在系統(tǒng)緩存中查找具有指定名稱的圖像對象,并返回該對象(如果存在)。如果緩存中還沒有匹配的圖像對象,則此方法從指定的文件加載圖像數(shù)據(jù),將其緩存,然后返回結(jié)果對象。


+(UIImage *)imageWithContentsOfFile:(NSString *)路徑


此方法不緩存圖像對象。


因此,我們可以看到,如果您有很多相同的UI元素(例如UITableViewCell)可能使用相同的圖像(通常作為圖標(biāo)使用),并且由于性能原因,我們當(dāng)然想重用同一圖像,這樣我們將為其他用途節(jié)省一些內(nèi)存。通常,重用的圖像通常在ui元素中使用,我們的用戶可能會(huì)對其進(jìn)行很多次操作。因此它對于我們重用它很有價(jià)值。因此,您可以選擇使用imageNamed方法。


另一方面,在應(yīng)用程序中,在應(yīng)用程序的生命周期中將存在一些UI元素,例如Button,徽標(biāo)視圖,因此這些ui元素使用的這些圖像也可能在應(yīng)用程序的過程中存在。在生命周期中,您無需考慮是否應(yīng)緩存這些圖像。因此,您可以選擇使用imageNamed方法。


相反,在應(yīng)用程序中,通常會(huì)動(dòng)態(tài)創(chuàng)建一些UI元素。例如,我們的應(yīng)用程序支持動(dòng)態(tài)背景,以便用戶可以選擇自己喜歡的背景。并且背景可以是圖像。因此,我們可能有一個(gè)界面,其中列出了許多不同的背景(通常使用UIImageView進(jìn)行顯示)供用戶選擇,我們可以將列表視圖命名為MyBackgroundListView。因此,一旦用戶選擇了背景圖片,則MyBackgroundListView應(yīng)該被銷毀,因?yàn)樗淹瓿善涔δ堋O麓斡脩粝胍钠浔尘皶r(shí),我們可以創(chuàng)建再次使用MyBackgroundListView。因此,不應(yīng)緩存MyBackgroundListView使用的圖像,否則我們的應(yīng)用程序的內(nèi)存將用完。因此,這一次您應(yīng)該使用 imageWithContentsOfFile方法。


正如蘋果公司支持Views中高分辨率屏幕的文檔所說


在具有高分辨率屏幕的設(shè)備上,imageNamed:,imageWithContentsOfFile:和initWithContentsOfFile:方法會(huì)自動(dòng)在名稱中使用@ 2x修飾符查找所請求圖像的版本。如果找到一個(gè),它將加載該圖像。如果不提供給定圖像的高分辨率版本,則該圖像對象仍會(huì)加載標(biāo)準(zhǔn)分辨率的圖像(如果存在)并在繪制過程中對其進(jìn)行縮放。


因此您會(huì)擔(dān)心圖像的搜索路徑是否存在視網(wǎng)膜屏幕問題。IOS將幫助您處理它。


對不起,我英語不好??赡軙?huì)有所幫助。


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

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超13個(gè)贊

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


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

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


查看完整回答
反對 回復(fù) 2019-12-12
  • 3 回答
  • 0 關(guān)注
  • 733 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)