iOS 编写高质量Objective-C代码(八)
前言:
這幾篇文章是小編在鉆研《Effective Objective-C 2.0》的知識產出,其中包含作者和小編的觀點,以及小編整理的一些demo。希望能幫助大家以簡潔的文字快速領悟原作者的精華。
在這里,向原作者Matt Galloway表達誠摯的敬意。
文章目錄如下:
-
iOS 編寫高質量Objective-C代碼(一)
-
iOS 編寫高質量Objective-C代碼(二)
-
iOS 編寫高質量Objective-C代碼(三)
-
iOS 編寫高質量Objective-C代碼(四)
-
iOS 編寫高質量Objective-C代碼(五)
-
iOS 編寫高質量Objective-C代碼(六)
-
iOS 編寫高質量Objective-C代碼(七)
本篇的主題是:“系統框架”。
在我們日常開發中,都會使用系統的一些框架。因此熟悉系統框架是很有必要的。
那么今天,我們就一起來探索一下系統框架中有哪些珍寶呢?
一、熟悉系統框架
系統框架包括但不限于:
-
1. Foundation:基礎框架。
提供了包括數據存儲和持久性,文本處理,日期和時間計算,排序和過濾以及網絡等功能。Foundation定義的類,協議和數據類型在整個macOS,iOS,watchOS和tvOS SDK中使用。
-
2. CoreFoundation:核心基礎框架。
提供了C語言級的基礎功能,為應用程序提供基本數據管理和服務功能。并可通過無縫橋接技術(__bridge)實現C語言類與OC對象的轉換。
-
3. UIKit:視圖框架。
為iOS與tvOS提供界面與視圖的功能。(重要:除非另有說明,否則一定要在主線程中使用UIKit框架。)
-
4. CoreAnimation:核心動畫框架。
提供了高幀速率和流暢的動畫功能,并且不會給CPU太多負擔,也不會降低應用程序的響應速度。
-
5. CoreGraphics:核心圖形框架。
基于Quartz繪圖引擎,提供了輕量級2D渲染所必備的數據結構與函數。包括CGPoint、CGSize、CGRect等數據結構。
-
6. CoreData:核心數據框架。
提供了將OC對象寫入數據庫的功能,便于持久保存。
-
7. CoreText:文本框架。
提供了C語言級別的文字排版及渲染操作。
-
8. AVFoundation:音視頻框架。
提供了控制攝像頭,以及處理、合成、控制、導入、導出音頻/視頻的功能。
-
9. CFNetwork:網絡框架。
提供了C語言級別的網絡通信能力,將BSD socket抽象成易于使用的網絡接口,以便網絡通信。
-
10. ARKit:AR框架。
-
11. SpriteKit:2D游戲框架。
-
12. CoreLocation、MapKit:定位地圖相關框架。
-
13. Address Book:通訊錄框架。
-
14. HealthKit:健康相關框架。
-
15. HomeKit:為智能化硬件提供的框架。
-
16. PhotoKit:相冊框架。
……(還有很多框架,詳細的請看下面的官方文檔。)
PS:蘋果官方文檔
二、多用塊枚舉,少用for循環
遍歷collection有四種方法:for循環、NSEnumerator遍歷法、for-in快速遍歷法、塊枚舉法。
1. for循環:群昵稱:ios-Swift/Object C開發上架
群號: 869685378 ? 找ios馬甲包開發者合作,有興趣請添加Q 51259559
最基本的循環方法,與其他語言類似。
NSArray?*arr?=?@[@1,?@2,?@3,?@4,?@5];for?(NSInteger?i?=?0;?i?<?5;?i++)?{NSLog(@"%@",arr[i]); }?
2. NSEnumerator遍歷法:
?
NSArray?*arr?=?@[@1,?@2,?@3,?@4,?@5];NSEnumerator?*enumerator?=?[arr?objectEnumerator]; NSNumber?*num?=?nil;while?((num?=?[enumerator?nextObject])?!=?nil)?{NSLog(@"%@",num); }?
3. for-in快速遍歷法:
在開發中,常使用的方法。
NSArray?*arr?=?@[@1,?@2,?@3,?@4,?@5];for?(NSNumber?*num?in?arr)?{NSLog(@"%@",num); }?
4. 塊枚舉法:
基于塊來遍歷,遍歷時既能獲取對象,也能知道其下標。此外,還能通過stop對象終止遍歷。(即調用*stop = YES即可)
-
官方:Executes a given block using each object in the array, starting with the first object and continuing through the array to the last object.
-
翻譯:使用數組中的每個對象執行給定的block,從第一個對象開始,一直到最后一個對象。
-
基本使用:
?
三、對自定義其內存管理語義的collection使用無縫橋接
無線橋接技術(__bridge):可將“OC對象”與“C語言中的數據結構”來回轉換。
舉個簡單的例子:NSArray與CFArrayRef的無縫橋接。
NSArray?*anNSArray?=?@[@1,?@2,?@3,?@4,?@5];CFArrayRef?aCFArray?=?(__bridge?CFArrayRef)anNSArray;//!<?無縫橋接 NSLog(@"Size?of?array?=?%li",?CFArrayGetCount(aCFArray)); //?Output:?Size?of?array?=?5?
四、構建緩存時選用NSCache而非NSDictionary
NSCache的優點:
-
當系統資源將要耗盡時,NSCache會自動刪減。并先行刪除“最久未使用的對象”。
-
NSCache不會自動拷貝鍵。(PS:因為NSCache沒有遵循/協議)
-
NSCache是線程安全的。在不加同步鎖的前提下,依然支持多線程訪問NSCache。
五、精簡load與initialize的實現代碼
load與initialize方法都要保持精簡。
load中的注意點:
如果分類和所屬類都定義了load方法,則會先調用主類里的load方法,然后再調用分類的。
在load方法內使用其他類是不安全的。(因為調用時其他類可能還沒有加載好)
如果某個類本身沒有實現load方法,那么不管超類是否實現load方法都不會調用。
load應只用于調試,而非執行任務。
initialize中的注意點:
如果某個類未實現initialize,而其超類實現了,就會運行超類的方法。
開發者無法控制類的初始化時機。
如果某個類的initizalize實現代碼很復雜,其中用到了別的類。若那些類還沒初始化,就會強迫他們初始化。
initialize方法只應該用來設置內部數據。
六、別忘了NSTimer會保留其目標對象
-
NSTimer對象會保留其目標,直到計時器本身失效為止,調用[_timer invalidate];可令計時器失效。另外,一次性的計時器在觸發完任務后也會失效。
-
反復執行任務的計時器(repeating timer)很容易產生循環引用。如果這種計時器的目標對象又保留了計時器本身,那就會產生循環引用,導致內存泄漏。可能是直接發生的,也可能是其他對象間接發生的。
作者: MrLiuQ
群昵稱:ios-Swift/Object C開發上架
群號: 869685378 ? 找ios馬甲包開發者合作,有興趣請添加Q 51259559
總結
以上是生活随笔為你收集整理的iOS 编写高质量Objective-C代码(八)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Excel办公(两张表数据匹配)
- 下一篇: 刚刚,低调的DataVisor发布了“高