app性能優(yōu)化技巧

一、初級(jí):

在開(kāi)發(fā)過(guò)程中,下面這些初級(jí)技巧需要時(shí)刻注意:

1)使用ARC進(jìn)行內(nèi)存管理

2)在適當(dāng)?shù)那闆r下使用reuseIdentifier

3)盡可能將View設(shè)置成不透明

4)避免臃腫的xib

5)不要阻塞主線程

6)讓圖片的大小跟UIImageView一樣

7)選擇正確的集合

8)使用GZIP壓縮

初級(jí)性能提升:

1.使用ARC進(jìn)行內(nèi)存管理

ARC不僅解決了最常見(jiàn)的內(nèi)存泄漏問(wèn)題,還有助于程序性能的提升,當(dāng)程序中的對(duì)象不再需要的時(shí)候,ARC會(huì)在后臺(tái)自動(dòng)的幫助銷(xiāo)毀對(duì)象。值得注意的是ARC并不能避免所有的內(nèi)存泄漏,使用ARC后可能還會(huì)有內(nèi)存泄漏,主要原因是循環(huán)引用。常見(jiàn)的循環(huán)引用有:block、定時(shí)器、代理等。

2.在適當(dāng)?shù)那闆r下使用reuseIdentifier

在沒(méi)有正確的為UITableViewCells、UICollectionViewCells、UITableViewHeaderFooterViews設(shè)置reuseIdentifier。為了獲得最佳性能,當(dāng)在tableView:cellForRowATIndexPath:方法中返回cell時(shí),tableView的數(shù)據(jù)源一般會(huì)重用UITableViewCell對(duì)象。tableView維護(hù)著UITableViewCell對(duì)象的一個(gè)隊(duì)列或者列表,這些數(shù)據(jù)源已經(jīng)被標(biāo)記重用了。假如沒(méi)有使用重用,tableView每次顯示一個(gè)row時(shí)都會(huì)配置一個(gè)全新的cell,這其實(shí)是一個(gè)非常消耗資源的操作,并且會(huì)影響程序中tableView滾動(dòng)的效率。

3.盡可能將View設(shè)置成不透明

Opaque屬性提示繪制系統(tǒng)如何處理view。如果opaque設(shè)置為yes,繪圖系統(tǒng)會(huì)將view看為完全不透明,這樣繪圖系統(tǒng)就可以優(yōu)化一些繪制操作以提升性能。如果設(shè)置為no,那么繪圖系統(tǒng)結(jié)合其它內(nèi)容來(lái)處理view。默認(rèn)為yes。如果屏幕時(shí)靜止的,那么這個(gè)opaque屬性的設(shè)置與否不是一個(gè)大問(wèn)題。但是,如果view時(shí)嵌入到scrollView中,或者是復(fù)雜動(dòng)畫(huà)的一部分,不設(shè)置這個(gè)屬性的話肯定會(huì)影響程序的性能。可以通過(guò)模擬器的Debug\Color Blended Layers選項(xiàng)來(lái)查看哪些view沒(méi)有設(shè)置為不透明。為了程序的性能,最好將view設(shè)置為不透明。

4.避免臃腫的xib

如果必須要使用Xib的話,盡量讓xib文件簡(jiǎn)單。并且每個(gè)viewcontroller對(duì)應(yīng)一個(gè)xib文件,如果可以的話,把一個(gè)viewcontroller的view不同的層次單獨(dú)的分到一個(gè)xib文件中。這是因?yàn)楫?dāng)把一個(gè)xib文件加載到內(nèi)存時(shí),xib文件中的所有內(nèi)容都將被加載到內(nèi)存中,包括圖片。如果一個(gè)view不會(huì)立即使用,就會(huì)造成內(nèi)存的浪費(fèi)。而這在storyboard中時(shí)不會(huì)發(fā)生的,因?yàn)閟toryboard還在需要的時(shí)候才實(shí)例化一個(gè)viewcontroller。當(dāng)加載一個(gè)nib文件時(shí),也會(huì)將nib文件涉及到的圖片或者聲音資源加載到內(nèi)存中,并一直緩存著。

5.不要阻塞主線程

永遠(yuǎn)都不要在主線程上做繁重的任務(wù)。因?yàn)閁IKit的任務(wù)都在主線程中進(jìn)行,例如繪制、觸摸管理和輸入響應(yīng)等。在主線程上做所有任務(wù)的風(fēng)險(xiǎn)時(shí):如果你的代碼阻塞了主線程,那么程序?qū)⒊霈F(xiàn)反應(yīng)遲鈍。在執(zhí)行I/O操作中,大多數(shù)情況下都會(huì)阻塞主線程,這些操作需要讀寫(xiě)外部資源,例如磁盤(pán)或者網(wǎng)絡(luò)。如果你需要做一些其它類(lèi)型開(kāi)銷(xiāo)很大的操作(例如執(zhí)行一個(gè)時(shí)間密集型的計(jì)算或者對(duì)磁盤(pán)進(jìn)行讀寫(xiě)),那就使用GCD或者NSOperations和NSOperationQueues。

6.讓圖片的大小跟UIImageView一樣

如果需要將bundle中的圖片顯示到UIImageView中,請(qǐng)確保圖片和UIImageView的大小時(shí)一樣的。因?yàn)閳D片的縮放非常耗費(fèi)資源,特別是將UIImageView嵌入到UIScrollView中。如果是從遠(yuǎn)程服務(wù)中下載圖片,有時(shí)候你控制不了圖片的吃醋,或者在下載之前無(wú)法在服務(wù)器上進(jìn)行圖片的縮放,這種情況,當(dāng)圖片下載完成之后,你可以手動(dòng)進(jìn)行圖片的縮放(最好放在后臺(tái)線程中),然后再在UIImageView中使用縮放過(guò)的圖片。

7.選擇正確的集合

學(xué)習(xí)使用最適合的類(lèi)或者對(duì)象是編寫(xiě)高效代碼的基礎(chǔ)。特別時(shí)在處理集合數(shù)據(jù)時(shí),尤為重要。常見(jiàn)集合類(lèi)型:

數(shù)組:是一個(gè)值按順序排列的一個(gè)列表。根據(jù)索引可以快速查找,不過(guò)根據(jù)值進(jìn)行查找就比較慢,另外插入和刪除也比較慢。

字典:存儲(chǔ)鍵值對(duì),根據(jù)鍵可以快速查找。

Sets:是一個(gè)值無(wú)序排列的列表,根據(jù)值可以快速查找,另外插入和刪除也比較快。

8.使用GZIP壓縮

越來(lái)越多的程序依賴于外部數(shù)據(jù),這些數(shù)據(jù)一般來(lái)自遠(yuǎn)程服務(wù)器或者其它的外部API。有時(shí)候你需要下載這些數(shù)據(jù),這些數(shù)據(jù)可能時(shí)XML,JSON,HTML等,問(wèn)題是在移動(dòng)設(shè)備上的網(wǎng)絡(luò)時(shí)不確定的。用戶的設(shè)備可能在3G或者WIFI,但不管什么情況下都不要讓用戶等待。有一個(gè)可以優(yōu)化的選擇:使用GZIP對(duì)網(wǎng)絡(luò)傳輸中的數(shù)據(jù)進(jìn)行壓縮,這樣可以減小文件的大小,并加快下載的速度,對(duì)于文本數(shù)據(jù)特別有用,因?yàn)槲谋揪哂泻芨叩膲嚎s比。iOS中,如果使用NSURLConnection,那么默認(rèn)情況下已經(jīng)支持GZIP壓縮了,并且基于NSURLConnection的框架也支持GZIP壓縮,如AFNetworking。

二、中級(jí)

在性能優(yōu)化時(shí),當(dāng)你碰到一些復(fù)雜的問(wèn)題,應(yīng)該注意使用如下技巧:

9)重用和延遲加載view

10)緩存

11)考慮繪制

12)處理內(nèi)存警告

13)重用花銷(xiāo)很大的對(duì)象

14)使用Sprite Sheets

15)避免重新處理數(shù)據(jù)

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

17)設(shè)置適當(dāng)?shù)谋尘皥D片

18)降低web內(nèi)容的影響

19)設(shè)置陰影路徑

20)優(yōu)化TableView

21)選擇正確的數(shù)據(jù)存儲(chǔ)方式

中級(jí)性能提升

現(xiàn)在,在進(jìn)行代碼優(yōu)化時(shí),你已經(jīng)能夠完成一些初級(jí)性能優(yōu)化了。但是下面還有另外一些優(yōu)化方案,雖然可能不太明顯(取決于程序的架構(gòu)和相關(guān)代碼),但是,如果能夠正確的利用好這些方案,那么它們對(duì)性能的優(yōu)化將非常明顯!

9)重用和延遲加載view

程序界面中包含更多的view,意味著界面在顯示的時(shí)候,需要進(jìn)行更多的繪制任務(wù),也就意味著需要消耗更多的CPU和內(nèi)存資源。特別是在一個(gè)UIScrollView里加入了許多view。這種情況的管理技巧可以參考UITableView和UICollectionView的行為:不要一次性創(chuàng)建所有的subview,而是在需要的時(shí)候創(chuàng)建view,并且當(dāng)view使用完畢時(shí)候?qū)⑺麄兲砑拥街赜藐?duì)列中。這樣就可以盡在UIScrollView滾動(dòng)的時(shí)候才配置view,依次避免分配創(chuàng)建view帶來(lái)的成本,這可能時(shí)非常耗費(fèi)資源的?,F(xiàn)在有這樣一個(gè)問(wèn)題:在程序中需要顯示的view在什么時(shí)機(jī)創(chuàng)建(比如說(shuō),當(dāng)用戶點(diǎn)擊某個(gè)按鈕,需要顯示某個(gè)view),這里有兩種可選方法:一種是在屏幕第一次加載以及隱藏的時(shí)候,創(chuàng)建view,然后再需要的時(shí)候,再把view顯示出來(lái)。另一種時(shí)知道需要顯示view的時(shí)候,才創(chuàng)建并顯示view。每種方法都有各自的優(yōu)缺點(diǎn)。使用第一種方法,需要消耗更多的內(nèi)容,因?yàn)閯?chuàng)建出來(lái)的view一直占據(jù)著內(nèi)存,直到view被release,不過(guò),使用這種方法,當(dāng)用戶點(diǎn)擊按鈕時(shí),程序會(huì)很快的顯示出view,因?yàn)橹恍枰薷囊幌聉iew的可見(jiàn)性即可。而使用第二種方法則產(chǎn)生相反的效果,當(dāng)需要的時(shí)候才創(chuàng)建view,這會(huì)消耗更少的內(nèi)存,不過(guò),當(dāng)用戶點(diǎn)擊按鈕的時(shí)候,不會(huì)立即顯示出view。

10)緩存

在開(kāi)發(fā)程序時(shí),一個(gè)重要的規(guī)則就是“緩存重要的內(nèi)容”,這些內(nèi)容一般不會(huì)改變,并且訪問(wèn)的頻率比較高??梢跃彺嫘┦裁磧?nèi)容呢?比如遠(yuǎn)程服務(wù)器的響應(yīng)內(nèi)容、突破甚至是計(jì)算結(jié)果,比如cell的行高。NSURLConnection根據(jù)HTTP頭的處理過(guò)程,已經(jīng)把一些資源緩存在磁盤(pán)和內(nèi)存中了。你甚至可以手動(dòng)創(chuàng)建一個(gè)NSURLRequest,讓其只加載緩存的值。你可以使用NSURLConnection抓取一個(gè)URL請(qǐng)求,但是同樣可以使用AFNetworking來(lái)抓取,這種方法不用修改所有網(wǎng)絡(luò)相關(guān)的代碼,這是一個(gè)技巧。如果你需要緩存的內(nèi)容沒(méi)設(shè)計(jì)到HTTP請(qǐng)求,那么使用NSCache。NSCache的外觀和行為與NSDictionary類(lèi)似,但是,當(dāng)系統(tǒng)需要回收內(nèi)存時(shí),NSCache會(huì)自動(dòng)清理里面的內(nèi)容。

11)考慮繪制

在iOS中制作漂亮的按鈕有多種方法,可以使用全尺寸圖片,可縮放圖片,或者使用CALayer,CoreGraphics,甚至?xí)rOpenGL來(lái)手動(dòng)測(cè)量和繪制按鈕。當(dāng)然,這些方法的復(fù)雜程度也不同,并且性能也有所區(qū)別。簡(jiǎn)單來(lái)說(shuō),使用預(yù)渲染圖片技術(shù)是最快的。因?yàn)閕OS中不用等到在屏幕上顯示的時(shí)候才創(chuàng)建圖形和對(duì)形狀進(jìn)行繪制(圖片已經(jīng)創(chuàng)建好了),這樣帶來(lái)的問(wèn)題時(shí)需要把所有的圖片都放到程序bundle中,從未增加了程序的大小。因此使用可伸縮圖片在這里將派上用場(chǎng)了??梢砸瞥速M(fèi)空間的圖片(iOS可以重復(fù)利用)。并且針對(duì)不同的元素(例如按鈕)不需要?jiǎng)?chuàng)建不同的圖片。不過(guò),使用圖片的話會(huì)失去代碼對(duì)圖片的控制能力,進(jìn)而針對(duì)不同的程序,就需要重復(fù)的生成每一個(gè)需要的圖片,并反復(fù)的放到每個(gè)程序中。這個(gè)處理過(guò)程一般比較慢,另外一點(diǎn)就是如果你需要一個(gè)動(dòng)畫(huà),或者許多圖片都需要進(jìn)行輕微的調(diào)整(比如多種顏色的覆蓋),那么需要在程序中加入許多圖片,進(jìn)而增加了程序bundle的大小??偟膩?lái)說(shuō)嗎你需要考慮一下什么才是最重要的,繪制性能還是程序大小。一般來(lái)說(shuō)都重要,所以在同一個(gè)工程中,應(yīng)該兩種都考慮。

12)處理內(nèi)存警告

當(dāng)系統(tǒng)內(nèi)存偏低時(shí),iOS會(huì)通知所有在運(yùn)行的程序。如果程序收到了低內(nèi)存警告,在程序中必須盡量釋放內(nèi)存。最佳方法就是移除強(qiáng)飲用的涉及到的緩存、圖片對(duì)象,以及其它可以在之后使用時(shí)還可以重新創(chuàng)建的數(shù)據(jù)對(duì)象。UIKit中提供了如下幾種方法來(lái)接收低內(nèi)存警告:實(shí)現(xiàn)在appdelegate中的applicationDidReceiveMemoryWarning:方法。在UIViewController子類(lèi)中重寫(xiě)didReceiveMemoryWarning方法。在通知中心里面注冊(cè)UIApplicationDidReceiveMemoryWarningNotification通知在收到以上任意警告時(shí),需要立即釋放任何不需要的內(nèi)存。例如,UIViewController默認(rèn)情況是清除掉當(dāng)前不可見(jiàn)的view;在UIViewController的子類(lèi)中可以清除一些額外的數(shù)據(jù)。程序中沒(méi)有顯示在當(dāng)前屏幕中的圖片也可以release掉。當(dāng)收到低內(nèi)存警告時(shí),盡量釋放內(nèi)存是非常重要的。否則,運(yùn)行中的程序有可能會(huì)被系統(tǒng)殺掉。不過(guò),在清楚內(nèi)存時(shí)要注意一點(diǎn),確保被清除的對(duì)象之后還可以被創(chuàng)建出來(lái)。另外,在開(kāi)發(fā)程序的時(shí)候,用模擬器中的模擬內(nèi)存警告功能對(duì)程序進(jìn)行測(cè)試。

13)重用花銷(xiāo)很大的對(duì)象

有些對(duì)象的初始化非常慢,比如NSDataFormatter和NSCalendar。不過(guò)有時(shí)候可以避免使用這些對(duì)象,例如在解析JSON/XML中的日期時(shí)。當(dāng)使用這些對(duì)象時(shí),為了避免性能上的瓶頸,可以嘗試盡量重用這些對(duì)象,在類(lèi)中添加一個(gè)屬性或者創(chuàng)建一個(gè)靜態(tài)變量。注意:如果使用靜態(tài)變量對(duì)象會(huì)在程序運(yùn)行的時(shí)候一直存在,就像單例一樣。另外,在設(shè)置NSDataFormatter的日期格式時(shí),同樣跟創(chuàng)建新的一個(gè)NSDataFormatter實(shí)例對(duì)象一樣慢。因此在程序中如果需要頻繁的處理日期格式,那么對(duì)NSDataFormatter進(jìn)行重用時(shí)非常有必要的。

14)使用Sprite Sheets(游戲開(kāi)發(fā)時(shí)用的比較多)

15)避免重新處理數(shù)據(jù)

許多程序都需要從遠(yuǎn)程服務(wù)器中獲得數(shù)據(jù),以滿足程序的需求。這些數(shù)據(jù)一般是JSON/XML。在請(qǐng)求和接收數(shù)據(jù)時(shí),使用相同的數(shù)據(jù)結(jié)構(gòu)非常重要。因?yàn)樵趦?nèi)存中把數(shù)據(jù)轉(zhuǎn)換成適合程序的數(shù)據(jù)格式時(shí)需要付出額外代價(jià)的。例如你需要在tableView中顯示一些數(shù)據(jù),那么請(qǐng)求和接收的數(shù)據(jù)格式最好是數(shù)組格式,這樣可以避免一些中間操作。

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

將數(shù)據(jù)從程序傳到服務(wù)器有多種方法,其中使用的數(shù)據(jù)格式基本都是JSON/XML。JSON的解析速度非??欤⑶乙萖ML小得多,也就意味著只需要傳輸更少數(shù)據(jù)。并且在iOS5之后,已經(jīng)有內(nèi)置的JSON反序列化API了,所以使用JSON是很容易的。不過(guò)XML也有它自己的優(yōu)勢(shì):如果使用SAX方法來(lái)解析XNL,那么可以邊讀XML邊解析,并不用等到全部的XML獲取到了才開(kāi)始解析,這是與JSON不同的。當(dāng)處理大量數(shù)據(jù)時(shí),這種方法可以提升性能并能減少內(nèi)存的消耗。

17)設(shè)置適當(dāng)?shù)谋尘皥D片

在iOS中,跟別的很多東西類(lèi)似,這里也有兩種方法給view設(shè)置一個(gè)背景圖片:一種時(shí)可以使用UIColor的colorWithPatternImage方法來(lái)創(chuàng)建一個(gè)顏色,并將這個(gè)顏色設(shè)置為view的背景顏色。另一種時(shí)可以給view添加一個(gè)UIImageView的子視圖。如果你有一個(gè)全尺寸的背景圖片,那么應(yīng)該使用UIImageView,因?yàn)閁IColor的那個(gè)方法是用來(lái)創(chuàng)建小圖片的,該圖片會(huì)被重復(fù)使用。此時(shí)使用UIImageView會(huì)節(jié)省很多內(nèi)存。不過(guò)如果你計(jì)劃用小圖片當(dāng)做背景,那么應(yīng)該使用UIColor的那個(gè)方法。這種情況下繪制速度會(huì)很快,并且不會(huì)消耗大量的內(nèi)存。

18)降低web內(nèi)容的影響

UIWebView非常有用,用它可以很容易顯示web內(nèi)容,甚至可以構(gòu)建UIKit空間難以顯示的內(nèi)容。但用UIWebView組件沒(méi)有蘋(píng)果的safari快。這是因?yàn)镴IT編譯限制了WebView的Nitro引擎的使用。因此為了提高性能,需要調(diào)整HTML的大小。首先盡量擺脫JavaScript并避免使用大的框架。另外盡量異步加載JavaScript文件。最后,讓使用到的圖片跟實(shí)際需要的一樣大小。如之前提到的,盡量使用sprite sheets,以此節(jié)省內(nèi)存和提升速度。

19)設(shè)置陰影路徑

如果需要在view或者layer中添加一個(gè)陰影,應(yīng)該怎么做呢?大多數(shù)開(kāi)發(fā)者首先將QuartzCore框架添加到工程,然后添加如下代碼:(#import // Somewhere later ...UIView *view = [[UIView alloc] init]; // Setup the shadow ...view.layer.shadowOffset = CGSizeMake(-1.0f, 1.0f);view.layer.shadowRadius = 5.0f;view.layer.shadowOpacity = 0.6;)看起來(lái)非常容易,然而CoreAnimation在渲染陰影想過(guò)之前,必須通過(guò)一個(gè)離屏才能確定view的形狀,而這個(gè)離屏操作非常耗費(fèi)資源。下面還有一種方法更容易讓系統(tǒng)進(jìn)行陰影渲染:設(shè)置陰影路徑:(view.layer.shadowPath = [[UIBezierPath bezierPathWithRect:view.bounds] CGPath];)通過(guò)設(shè)置陰影路徑,iOS就不用總是再計(jì)算該如何繪制陰影了。只需要使用你預(yù)先計(jì)算好的路徑即可。有一點(diǎn)不好的是,根據(jù)view的格式,自己可能很難計(jì)算出路徑。另外一個(gè)問(wèn)題就是當(dāng)view的frame改變時(shí),必須每次都更新一下陰影路徑。

20)優(yōu)化TableView

tableView需要快速的滾動(dòng),如果不能,用戶就會(huì)感覺(jué)到卡頓。為了讓tableView平滑的滾動(dòng),確保遵循了如下建議:

1.設(shè)置正確的reuseIdentifier以重用cell

2.盡量將view設(shè)置為不透明,包括cell本身

3.避免漸變、圖像縮放以及離屏繪制

4.如果row的高度不同,那么將其緩存下來(lái)

5.如果cell顯示的內(nèi)容來(lái)自網(wǎng)絡(luò),那么確保這些內(nèi)容是通過(guò)異步來(lái)獲取的

6.使用shadowPath來(lái)設(shè)置陰影

7.減少subview的數(shù)量

8.在cellforrowATindexpath中盡量做更少的操作。如果需要做一些處理,那么最好做過(guò)一次之后將其緩存起來(lái)

9.使用適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)來(lái)保存需要的信息

10.使用rowHeight、sectionFooterHeight和sectionHeaderHeight來(lái)設(shè)置一個(gè)恒定高度,而不要從delegate中獲取

21)選擇正確的數(shù)據(jù)存儲(chǔ)方式

當(dāng)需要存儲(chǔ)和讀取大量的數(shù)據(jù)時(shí),有如下選擇:

1.偏好設(shè)置(NSUserDefaults)

NSUserDefault只針對(duì)存儲(chǔ)小量數(shù)據(jù)(比如你的級(jí)別、聲音的開(kāi)關(guān)等)

2.屬性列表(XML、JSON或者plist文件)

大量數(shù)據(jù)保存為結(jié)構(gòu)化的文件也可能會(huì)帶來(lái)問(wèn)題。一般在解析這些結(jié)構(gòu)數(shù)據(jù)之前,需要將內(nèi)容全部加載到內(nèi)存中,這是很消耗資源的。雖然可以使用SAX來(lái)處理XML文件,但是比較復(fù)雜,另外加載到內(nèi)存中的所有對(duì)象還都不一定用得上。

3.歸檔(NSCoding)

由于同樣是對(duì)文件進(jìn)行讀寫(xiě),因此依然存在以上問(wèn)題,所以若要保存大量數(shù)據(jù),最好使用SQLite或CoreData。通過(guò)他們可以進(jìn)行具體的查詢,只需要獲取或者加載需要的對(duì)象,避免對(duì)數(shù)據(jù)進(jìn)行不合理的搜索。在性能方面都差不多。最大區(qū)別實(shí)際上就在用法上。CoreData代表一個(gè)對(duì)象模型,而Sqlite只是一個(gè)DBMS,一般蘋(píng)果建議使用coredata。

4.本地?cái)?shù)據(jù)庫(kù)(SQLite)

5.CoreData

三、高級(jí)

當(dāng)且僅當(dāng)下面這些技巧能夠解決問(wèn)題的時(shí)候,才使用它們:

22)加速啟動(dòng)時(shí)間

23)使用Autorelease Pool

24)緩存圖片——或者不緩存

25)盡量避免Data格式化

26)高級(jí)性能提升

高級(jí)性能提升

尋找一些高明的方法,讓自己變?yōu)橐粋€(gè)全代碼大牛?下面這些高級(jí)的性能優(yōu)化技巧可以在適當(dāng)?shù)臅r(shí)候讓程序盡可能的高效運(yùn)行。

22)加速啟動(dòng)時(shí)間

能快速的啟動(dòng)程序非常重要,特別是在用戶第一次啟動(dòng)程序時(shí)。讓程序盡量快速啟動(dòng)的方法就是盡量以異步方式執(zhí)行任務(wù),例如網(wǎng)絡(luò)請(qǐng)求,數(shù)據(jù)訪問(wèn)或解析。另外,避免使用臃腫的xib,因?yàn)閤ib的加載是在主線程中進(jìn)行的。Storyboard沒(méi)有這樣的問(wèn)題。注意:在利用xcode進(jìn)行調(diào)試時(shí),watchdog不會(huì)運(yùn)行,所有設(shè)備中測(cè)試程序啟動(dòng)性能時(shí),不要將設(shè)備連接到xcode。

23)使用Autorelease Pool

NSAutoreleasePool負(fù)責(zé)釋放一個(gè)代碼塊中的自動(dòng)釋放現(xiàn)象。一般是由UIKit創(chuàng)建的。

24)緩存圖片——或者不緩存

iOS中從程序bundle中加載UIImage一般有兩種方法。第一種比較常見(jiàn):imageNamed:第二種比較少用:imageWithContentsOfFile:。前者的有點(diǎn)在于可以緩存已經(jīng)加載的圖片,這個(gè)方法會(huì)在系統(tǒng)緩存中根據(jù)指定的名字尋找圖片,如果找到了就返回,如果沒(méi)有找到就從指定的文件中加載,并緩存起來(lái),然后再將結(jié)果返回。后者只是簡(jiǎn)單的加載圖片,并不會(huì)將圖片緩存。那么,如果要加載一個(gè)很大的圖片,并且只使用一次,那么就不需要緩存這張圖片,直接用后者就好。如果系統(tǒng)需要重用那么就選擇前者。

25)盡量避免Data格式化

如果有許多日期需要使用NSDateFormatter,那么需要小心對(duì)待,如前文提到的,任何時(shí)候都應(yīng)該盡量重用NSDateFormatter。然而,如果你需要更快的速度,那么應(yīng)該使用C語(yǔ)言的方法來(lái)解析日期,而不是NSDateFormatter。注意,許多網(wǎng)絡(luò)api返回的時(shí)間戳都是毫秒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,167評(píng)論 25 708
  • 性能對(duì) iOS 應(yīng)用的開(kāi)發(fā)尤其重要,如果你的應(yīng)用失去反應(yīng)或者很慢,那么App Store的評(píng)論顯而易見(jiàn)。然而...
    楚簡(jiǎn)約閱讀 2,445評(píng)論 0 6
  • 當(dāng)出現(xiàn)App啟動(dòng)慢、界面跳轉(zhuǎn)慢、事件相應(yīng)慢、滑動(dòng)和動(dòng)畫(huà)卡頓、展現(xiàn)內(nèi)容慢等問(wèn)題的時(shí)候意味著App性能出現(xiàn)問(wèn)題,這個(gè)時(shí)...
    Kurtis閱讀 383評(píng)論 0 0
  • 大學(xué)之前我的衣服都是母親帶領(lǐng)著去買(mǎi)的,畢竟是她用點(diǎn)滴呵護(hù)長(zhǎng)成的姑娘,我適合什么款式,哪種顏色會(huì)襯的我比較好看...
    顧知己閱讀 966評(píng)論 1 3
  • 遲到一天的日記,2016.7.10正式踏上程序猿之路,一個(gè)全新的沒(méi)有接觸過(guò)的領(lǐng)域。這兩天學(xué)到了很多很多的東西,如何...
    jayck閱讀 241評(píng)論 0 0

友情鏈接更多精彩內(nèi)容