日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

iOS程序性能優(yōu)化的技巧

瀏覽:83日期:2022-09-17 08:47:31

1. 用ARC管理內(nèi)存

ARC(Automatic ReferenceCounting, 自動引用計數(shù))和iOS5一起發(fā)布,它避免了最常見的也就是經(jīng)常是由于我們忘記釋放內(nèi)存所造成的內(nèi)存泄露。它自動為你管理retain和release的過程,所以你就不必去手動干預(yù)了。忘掉代碼段結(jié)尾的release簡直像記得吃飯一樣簡單。而ARC會自動在底層為你做這些工作。除了幫你避免內(nèi)存泄露,ARC還可以幫你提高性能,它能保證釋放掉不再需要的對象的內(nèi)存。

2.盡量把views設(shè)置為透明

如果你有透明的Views你應(yīng)該設(shè)置它們的opaque屬性為YES。

原因是這會使系統(tǒng)用一個最優(yōu)的方式渲染這些views。這個簡單的屬性在IB或者代碼里都可以設(shè)定。

Apple的文檔對于為圖片設(shè)置透明屬性的描述是:

(opaque)這個屬性給渲染系統(tǒng)提供了一個如何處理這個view的提示。如果設(shè)為YES,渲染系統(tǒng)就認(rèn)為這個view是完全不透明的,這使得渲染系統(tǒng)優(yōu)化一些渲染過程和提高性能。如果設(shè)置為NO,渲染系統(tǒng)正常地和其它內(nèi)容組成這個View。默認(rèn)值是YES。

在相對比較靜止的畫面中,設(shè)置這個屬性不會有太大影響。然而當(dāng)這個view嵌在scroll view里邊,或者是一個復(fù)雜動畫的一部分,不設(shè)置這個屬性的話會在很大程度上影響app的性能。

你可以在模擬器中用DebugColor Blended Layers選項來發(fā)現(xiàn)哪些view沒有被設(shè)置為opaque。目標(biāo)就是,能設(shè)為opaque的就全設(shè)為opaque!

這里有一點需要注意,只要是有中文字符的Label,哪怕你設(shè)置成不透明,模擬器中這個Label依然會變紅,這個猜測是字符繪制的時候出的問題,這個目前沒找到好的解決方法。

3.避免過于龐大的XIB

iOS5中加入的Storyboards(分鏡)正在快速取代XIB。然而XIB在一些場景中仍然很有用。比如你的app需要適應(yīng)iOS5之前的設(shè)備,或者你有一個自定義的可重用的view,你就不可避免地要用到他們。

如果你不得不XIB的話,使他們盡量簡單。嘗試為每個Controller配置一個單獨的XIB,盡可能把一個View Controller的view層次結(jié)構(gòu)分散到單獨的XIB中去。

需要注意的是,當(dāng)你加載一個XIB的時候所有內(nèi)容都被放在了內(nèi)存里,包括任何圖片。如果有一個不會即刻用到的view,你這就是在浪費寶貴的內(nèi)存資源了。Storyboards就是另一碼事兒了,storyboard僅在需要時實例化一個view controller.

當(dāng)家在XIB是,所有圖片都被chache,如果你在做OS X開發(fā)的話,聲音文件也是。Apple在相關(guān)文檔中的記述是:

當(dāng)你加載一個引用了圖片或者聲音資源的nib時,nib加載代碼會把圖片和聲音文件寫進內(nèi)存。在OS X中,圖片和聲音資源被緩存在named cache中以便將來用到時獲取。在iOS中,僅圖片資源會被存進named caches。取決于你所在的平臺,使用NSImage 或UIImage的imageNamed:方法來獲取圖片資源。

這個問題我深有體會,用xib寫的界面加載速度比直接用代碼寫的要慢好多

4. 在Image Views中調(diào)整圖片大小

如果要在UIImageView中顯示一個來自bundle的圖片,你應(yīng)保證圖片的大小和UIImageView的大小相同。在運行中縮放圖片是很耗費資源的,特別是UIImageView嵌套在UIScrollView中的情況下。

如果圖片是從遠(yuǎn)端服務(wù)加載的你不能控制圖片大小,比如在下載前調(diào)整到合適大小的話,你可以在下載完成后,最好是用background thread,縮放一次,然后在UIImageView中使用縮放后的圖片。

5. 選擇正確的Collection

學(xué)會選擇對業(yè)務(wù)場景最合適的類或者對象是寫出能效高的代碼的基礎(chǔ)。當(dāng)處理collections時這句話尤其正確。

一些常見collection的總結(jié):

Arrays: 有序的一組值。使用index來lookup很快,使用value lookup很慢,插入/刪除很慢。

Dictionaries: 存儲鍵值對。用鍵來查找比較快。

Sets: 無序的一組值。用值來查找很快,插入/刪除很快。因為Set用到了哈希,所以插入刪除查找速度比Array快很多

6. 打開gzip壓縮

大量app依賴于遠(yuǎn)端資源和第三方API,你可能會開發(fā)一個需要從遠(yuǎn)端下載XML, JSON, HTML或者其它格式的app。

問題是我們的目標(biāo)是移動設(shè)備,因此你就不能指望網(wǎng)絡(luò)狀況有多好。一個用戶現(xiàn)在還在edge網(wǎng)絡(luò),下一分鐘可能就切換到了3G。不論什么場景,你肯定不想讓你的用戶等太長時間。

減小文檔的一個方式就是在服務(wù)端和你的app中打開gzip。這對于文字這種能有更高壓縮率的數(shù)據(jù)來說會有更顯著的效用。

好消息是,iOS已經(jīng)在NSURLConnection中默認(rèn)支持了gzip壓縮,當(dāng)然AFNetworking這些基于它的框架亦然。像Google App Engine這些云服務(wù)提供者也已經(jīng)支持了壓縮輸出。

7. 重用和延遲加載(lazy load) Views

更多的view意味著更多的渲染,也就是更多的CPU和內(nèi)存消耗,對于那種嵌套了很多view在UIScrollView里邊的app更是如此。

這里我們用到的技巧就是模仿UITableView和UICollectionView的操作:不要一次創(chuàng)建所有的subview,而是當(dāng)需要時才創(chuàng)建,當(dāng)它們完成了使命,把他們放進一個可重用的隊列中。

這樣的話你就只需要在滾動發(fā)生時創(chuàng)建你的views,避免了不劃算的內(nèi)存分配。

創(chuàng)建views的能效問題也適用于你app的其它方面。想象一下一個用戶點擊一個按鈕的時候需要呈現(xiàn)一個view的場景。有兩種實現(xiàn)方法:

創(chuàng)建并隱藏這個view當(dāng)這個screen加載的時候,當(dāng)需要時顯示它; 當(dāng)需要時才創(chuàng)建并展示。

每個方案都有其優(yōu)缺點。用第一種方案的話因為你需要一開始就創(chuàng)建一個view并保持它直到不再使用,這就會更加消耗內(nèi)存。然而這也會使你的app操作更敏感因為當(dāng)用戶點擊按鈕的時候它只需要改變一下這個view的可見性。

第二種方案則相反-消耗更少內(nèi)存,但是會在點擊按鈕的時候比第一種稍顯卡頓。

8.權(quán)衡渲染方法

在iOS中可以有很多方法做出漂亮的按鈕。你可以用整幅的圖片,可調(diào)大小的圖片,或者可以用CALayer, CoreGraphics甚至OpenGL來畫它們。當(dāng)然每個不同的解決方法都有不同的復(fù)雜程度和相應(yīng)的性能。

簡單來說,就是用事先渲染好的圖片更快一些,因為如此一來iOS就免去了創(chuàng)建一個圖片再畫東西上去然后顯示在屏幕上的程序。問題是你需要把所有你需要用到的圖片放到app的bundle里面,這樣就增加了體積?這就是使用可變大小的圖片更好的地方了:你可以省去一些不必要的空間,也不需要再為不同的元素(比如按鈕)來做不同的圖。

然而,使用圖片也意味著你失去了使用代碼調(diào)整圖片的機動性,你需要一遍又一遍不斷地重做他們,這樣就很浪費時間了,而且你如果要做一個動畫效果,雖然每幅圖只是一些細(xì)節(jié)的變化你就需要很多的圖片造成bundle大小的不斷增大。

總得來說,你需要權(quán)衡一下利弊,到底是要性能能還是要bundle保持合適的大小。

9.處理內(nèi)存警告

一旦系統(tǒng)內(nèi)存過低,iOS會通知所有運行中app。在官方文檔中是這樣記述:

如果你的app收到了內(nèi)存警告,它就需要盡可能釋放更多的內(nèi)存。最佳方式是移除對緩存,圖片object和其他一些可以重創(chuàng)建的objects的strong references.

幸運的是,UIKit提供了幾種收集低內(nèi)存警告的方法:

在app delegate中使用applicationDidReceiveMemoryWarning:的方法

在你的自定義UIViewController的子類(subclass)中覆蓋didReceiveMemoryWarning

注冊并接收 UIApplicationDidReceiveMemoryWarningNotification的通知

一旦收到這類通知,你就需要釋放任何不必要的內(nèi)存使用。

例如,UIViewController的默認(rèn)行為是移除一些不可見的view,它的一些子類則可以補充這個方法,刪掉一些額外的數(shù)據(jù)結(jié)構(gòu)。一個有圖片緩存的app可以移除不在屏幕上顯示的圖片。

這樣對內(nèi)存警報的處理是很必要的,若不重視,你的app就可能被系統(tǒng)殺掉。

然而,當(dāng)你一定要確認(rèn)你所選擇的object是可以被重現(xiàn)創(chuàng)建的來釋放內(nèi)存。一定要在開發(fā)中用模擬器中的內(nèi)存提醒模擬去測試一下。

當(dāng)然,現(xiàn)在iOS設(shè)備運行內(nèi)存越來越大,這一點很難出現(xiàn)了

10. 使用Sprite Sheets

Sprite sheet可以讓渲染速度加快,甚至比標(biāo)準(zhǔn)的屏幕渲染方法節(jié)省內(nèi)存。

11.避免反復(fù)處理數(shù)據(jù)

許多應(yīng)用需要從服務(wù)器加載功能所需的常為JSON或者XML格式的數(shù)據(jù)。在服務(wù)器端和客戶端使用相同的數(shù)據(jù)結(jié)構(gòu)很重要。在內(nèi)存中操作數(shù)據(jù)使它們滿足你的數(shù)據(jù)結(jié)構(gòu)是開銷很大的。

比如你需要數(shù)據(jù)來展示一個table view,最好直接從服務(wù)器取array結(jié)構(gòu)的數(shù)據(jù)以避免額外的中間數(shù)據(jù)結(jié)構(gòu)改變。

類似的,如果需要從特定key中取數(shù)據(jù),那么就使用鍵值對的dictionary。

這一點在處理大量數(shù)據(jù)的時候極為重要,用空間換時間的方法也許是極好的。

12.選擇正確的數(shù)據(jù)格式

從app和網(wǎng)絡(luò)服務(wù)間傳輸數(shù)據(jù)有很多方案,最常見的就是JSON和XML。你需要選擇對你的app來說最合適的一個。

解析JSON會比XML更快一些,JSON也通常更小更便于傳輸。從iOS5起有了官方內(nèi)建的JSON deserialization就更加方便使用了。

但是XML也有XML的好處,比如使用SAX來解析XML就像解析本地文件一樣,你不需像解析json一樣等到整個文檔下載完成才開始解析。當(dāng)你處理很大的數(shù)據(jù)的時候就會極大地減低內(nèi)存消耗和增加性能。

以上就是iOS程序性能優(yōu)化的建議的詳細(xì)內(nèi)容,更多關(guān)于ios 程序性能優(yōu)化的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: IOS
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产视频亚洲| 久久99免费视频| 老司机免费视频一区二区| 亚洲一区不卡| 99久久亚洲精品蜜臀| 日本中文字幕视频一区| 综合五月婷婷| 91精品综合| 桃色av一区二区| 97人人精品| 久久亚洲精品中文字幕| 国产精品一区二区三区www| 亚洲最大av| 日韩中文字幕区一区有砖一区 | 色爱综合网欧美| 国产精品激情| 久久精品72免费观看| 日韩欧美中文在线观看| 日本午夜精品久久久久| 少妇精品久久久| 久久99蜜桃| 精品美女视频| 欧洲精品一区二区三区| 国产91在线精品| 水蜜桃精品av一区二区| 亚洲欧美专区| 日韩精品91亚洲二区在线观看| 午夜一级久久| 日韩影院精彩在线| 国产亚洲电影| 亚洲欧洲美洲国产香蕉| 亚洲精品极品| 国产精区一区二区| 精品视频免费| 久久男人天堂| 卡一卡二国产精品| 色天使综合视频| 蜜桃精品在线| 精品1区2区3区4区| 日本va欧美va瓶| 国产日韩欧美三级| 麻豆精品久久久| 欧美成人日韩| 日韩精品一二三区| 亚洲香蕉视频| 亚洲人妖在线| 精品国产a一区二区三区v免费| 在线亚洲成人| 天堂av在线| 亚洲日本网址| 亚洲伊人精品酒店| 亚洲伊人影院| 欧美天堂一区| 国产精品亚洲欧美日韩一区在线| 日韩1区在线| 欧美美女一区| 中文字幕日韩亚洲| 国产成人免费视频网站视频社区| 桃色一区二区| 欧美日韩视频| 欧美激情五月| 亚洲v在线看| 麻豆精品91| 日韩精品五月天| 日韩一区电影| 欧美日韩精品免费观看视频完整| 蜜臀av性久久久久蜜臀aⅴ流畅| 蜜桃免费网站一区二区三区| 国产精品成人**免费视频| 国产一区不卡| 欧美成人午夜| 麻豆一区二区三区| 欧美精选视频一区二区| 亚洲综合欧美| 亚洲精品在线a| 久久麻豆视频| 亚洲大全视频| 亚洲午夜在线| 亚洲欧美久久久| 国产美女精品视频免费播放软件| 国产一区二区三区天码| 老牛影视一区二区三区| 久久精品凹凸全集| 精品日韩视频| 97成人在线| 久久精品影视| 久久激情五月婷婷| www成人在线视频| 国产精品白丝久久av网站| 欧洲亚洲一区二区三区| 午夜久久tv| 日本а中文在线天堂| 视频一区欧美精品| 欧美激情日韩| 一区二区亚洲视频| 蜜桃tv一区二区三区| 国产欧美日韩一级| 99国产精品久久久久久久| 日本美女一区| 欧美精品aa| 亚洲精品123区| 黄色网一区二区| 日韩国产在线观看| 免费精品视频在线| 日韩大片在线| 日韩av成人高清| 蜜桃视频在线网站| 国产一区二区亚洲| 久久精品99国产精品| 麻豆成人在线观看| 91av一区| caoporn视频在线| jiujiure精品视频播放| 亚洲三级国产| 精品国产美女a久久9999| 亚洲天堂久久| 欧美片第1页综合| 丝袜美腿一区二区三区| 捆绑调教美女网站视频一区| 亚洲日韩视频| 日韩精品一二区| 国产欧美在线| 免费在线观看一区二区三区| 成人免费网站www网站高清| 中文日韩欧美| 亚洲免费一区三区| 国产高清不卡| 日本aⅴ免费视频一区二区三区| 国产精品福利在线观看播放| 99热免费精品| 国产美女精品视频免费播放软件| 日韩精品视频在线看| 日韩av在线免费观看不卡| 激情五月色综合国产精品| 91欧美日韩| 欧美日韩一区二区综合| 国产69精品久久| 国产精久久久| 91亚洲无吗| 国产精品国产三级在线观看| 日韩成人精品一区二区三区| 少妇精品久久久一区二区| 欧美日韩a区| 老司机免费视频一区二区三区| 国内精品伊人| 99久久精品国产亚洲精品| 国产中文在线播放| 一区二区精品伦理...| 亚洲不卡av不卡一区二区| 亚洲免费婷婷| 婷婷综合一区| 国产精品亚洲片在线播放| 91欧美国产| 欧美另类综合| 亚洲精品免费观看| 久久av综合| 色婷婷精品视频| 丝袜美腿亚洲一区| 国产精品视频一区二区三区四蜜臂 | 欧美日本三区| 国产一区二区三区四区大秀| 91精品一区二区三区综合| 蜜桃视频在线观看一区二区| 99成人在线| 欧美日韩一区二区国产| 91亚洲国产高清| 午夜日本精品| 国产日韩欧美中文在线| 欧美aa一级| 亚洲欧洲日韩精品在线| 麻豆国产精品一区二区三区| 欧美jjzz| 国产精品一区二区三区www| 在线观看精品| 亚洲不卡视频| 中文字幕在线高清| 亚洲一二av| 国产一区精品福利| 在线精品小视频| 国产精品久久久久久久久久久久久久久 | 精品国产欧美日韩| 欧美在线资源| 美女在线视频一区| av成人国产| 免费在线亚洲| 精品1区2区3区4区| 国产精品婷婷| 久久亚洲美女| 国产欧美另类| 欧美91视频| 国产极品模特精品一二| 欧美特黄一级| 国产在线一区不卡| 亚洲伊人精品酒店| 在线看片国产福利你懂的| 亚洲欧美在线综合| 久久久久免费av| 国产精品久久久免费| 欧美日韩视频| 国产成人精品一区二区免费看京 |