4) 避免臃腫的XIBs
避免臃腫的XIBs
在iOS 5中開始使用Storyboards,并且將替代XIBs。不過在有些情況下XIBs仍然有用。如果你的程序需要運行在裝有iOS 5之前版本的設備上,或者要自定義可重用的view,那么是避免不了要使用XIBs的。
如果必須要使用XIBs的話,盡量讓XIBs文件簡單。并且每個view controller對于一個XIB文件,如果可以的話,把一個view controller的view不同的層次單獨分到一個XIBs文件中。
注意:當把一個XIB文件加載到內存時,XIB文件中的所有內容都將被加載到內存中,包括圖片。如果有一個view還不立即使用的話,就會造成內存的浪費。而這在storyboard中是不會發生的,因為storyboard還在需要的時候才實例化一個view controller。
當加載XIB時,所有涉及到的圖片都將被緩存,并且如果是開發的程序是針對OS X的話,聲音文件也會被加載。蘋果的官方文檔這樣說:
When you load a nib file that contains references to image or sound resources, the nib-loading code reads the actual image or sound file into memory and and caches it. In OS X, image and sound resources are stored in named caches so that you can access them later if needed. In iOS, only image resources are stored in named caches. To access images, you use the imageNamed: method of NSImage or UIImage, depending on your platform.
(當加載一個nib文件時,也會將nib文件涉及到的圖片或聲音資源加載到內存中,nib-loading代碼會將實際的圖片或聲音文件讀取到內存中,并一直緩存著。在OS X中,圖片和聲音資源都存儲在命名緩存中,這樣之后如果需要的話,可以對其進行訪問。在iOS中,只有圖片資源被存儲到命名緩存中。要訪問圖片的話,使用NSImage或UIImage(根據不同的系統)的imageNamed:方法即可。)
顯然,在使用storyboard時也會發生類似的緩存操作;不過我沒有找到相關內容的任何資料。如果你知道的話,可以告訴我哦!
想要學習storyboard的更多知識嗎?可以看看Matthijs Hollemans寫的iOS 5中:初級Storyboard Part 1和Part2。
5) 不要阻塞主線程
不要阻塞主線程
永遠都不要在主線程做繁重的任務。因為UIKit的任務都在主線程中進行,例如繪制、觸摸管理和輸入響應。
在主線程做所有任務的風險是:如果你的代碼阻塞了主線程,那么程序將出現反應遲鈍。這回招致用戶在App Store上對程序的差評!
在執行I/O操作中,大多數情況下都會祖塞主線程,這些操作需要從讀寫外部資源,例如磁盤或者網絡。
關于網絡操作可以使用NSURLConnection的如下方法,以異步的方式來執行:
+ (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler
或者使用第三方框架,例如AFNetworking。
如果你需要做一些其它類型開銷很大的操作(例如執行一個時間密集型的計算或者對磁盤進行讀寫),那么就使用GCD(Grand Central Dispatch),或NSOperations 和 NSOperationQueues。
下面的代碼是使用GCD的一個模板:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ // switch to a background thread and perform your expensive operation dispatch_async(dispatch_get_main_queue(), ^{ // switch back to the main thread to update your UI });});
如上代碼,為什么在第一個dispatch_async里面還嵌套了一個dispatch_async呢?這是因為關于UIKit相關的代碼需要在主線程里面執行。
對NSOperation和GCD感到好奇嗎?可以看看Ray Wenderlich中的教程:iOS中多線程和GCD—初級,以及Soheil Azarpour的如何使用NSOperations和NSOperationQueues教程。
6) 讓圖片的大小跟UIImageView一樣
確保圖片和UIImageView大小一致
如果需要將程序bundle中的圖片顯示到UIImageView中,請確保圖片和UIImageView的大小是一樣的。因為圖片的縮放非常耗費資源,特別是將UIImageView嵌入到UIScrollView中。
如果是從遠程服務中下載圖片,有時候你控制不了圖片的尺寸,或者在下載之前無法在服務器上進行圖片的縮放。這種情況,當圖片下載完之后,你可以手動進行圖片的縮放——做好是在后臺線程中!——然后再在UIImageView中使用縮放過的圖片。
7) 選擇正確的集合
選擇正確的集合
學習使用最適合的類或對象是編寫高效代碼的基礎。特別是在處理集合數據時,尤為重要。
蘋果的官網上有一篇文章:集合編程主題(Collections Programming Topics)——詳細的介紹了在集合數據中可以使用的類,以及什么情況下使用哪個類。在使用集合時,每個開發者都應該閱讀一下這個文檔。
太長,不想閱讀(TLDR)?下面是常見集合類型的一個簡介:
數組:是一個值按順序排列的一個列表。根據索引可以快速查找,不過根據值進行查找就比較慢,另外插入和刪除也比較慢。
字典: 存儲鍵/值對。根據鍵可以快速查找。
Sets: 是一個值無序排列的列表,根據值可以快速查找,另外插入和刪除也比較快。
8) 使用GZIP壓縮