ibireme和YYKit
可以看一下唐巧對ibireme的採訪
搜索一下ibireme的微博
簡言之,渴望成爲iOS大牛的新人,只有兩條捷徑,一是大量地閱讀優秀項目的源代碼,另一個就是自己動手實踐來嘗試。
YYKit
YYKit 是一組龐大、功能豐富的 iOS 組件。
爲了儘量複用代碼,這個項目中的某些組件之間有比較強的依賴關係。爲了方便其他開發者使用,我從中拆分出以下獨立組件:
- YYModel — 高性能的 iOS JSON 模型框架。
- YYCache — 高性能的 iOS 緩存框架。
- YYImage — 功能強大的 iOS 圖像框架。
- YYWebImage — 高性能的 iOS 異步圖像加載框架。
- YYText — 功能強大的 iOS 富文本框架。
- YYKeyboardManager — iOS 鍵盤監聽管理工具。
- YYDispatchQueuePool — iOS 全局併發隊列管理工具。
- YYAsyncLayer — iOS 異步繪製與顯示的工具。
- YYCategories — 功能豐富的 Category 類型工具庫。
YYModel的學習
iOS開發總會用到各種JSON模型轉換庫,本人最常用的MJExtension(小碼哥出品),轉換效率很高,使用也比較簡單,只要前後臺約定好,json直接就轉成了model。另外還有JSONModel,Mantle,FastEasyMapping,Manually等等。關於這幾個庫的測評,可以點擊ibireme的iOS JSON 模型轉換庫評測。
《iOS JSON 模型轉換庫評測》
本文中ABCDE表示等級,A爲最佳,E爲最差(僅爲個人學習用)
性能 | 容錯性 | 功能 | 侵入性 | |
---|---|---|---|---|
Mantle | E | B 會進行對象類型檢查 | A 可定製性最高 | B 需要 Model 繼承自某個基類,靈活性稍差,但功能豐富 |
JSONModel | C 和 MJExtension 差不多,Mantle 性能高 | D 沒有對錯誤類型的檢測,沒有對 App 的保護 | B 使用比較簡單,但功能相對 Mantle 稍弱 | B 需要 Model 繼承自某個基類,靈活性稍差,但功能豐富 |
MJExtension | C 和JSONModel 差不多,Mantle 性能高 | C 對部分對象進行自動轉換 | B 使用比較簡單,但功能相對 Mantle 稍弱 | A- Category 方式來實現,添加了一些沒有前綴的方法,易引起衝突 |
FastEasyMapping | B 較快 | E 沒有自動轉換的機制 | C 功能最少,使用也不算方便 | C 採用工具類來實現,使用靈活,但不方便 |
YYModel | A 快,接近手寫代碼的效率 | A 會進行對象類型檢查 | B 使用比較簡單,但功能相對 Mantle 稍弱 | A Category 方式來實現 |
附錄:原文中關於YYModel的幾個優化tips不錯,大家可以學習一下!
緩存
Model JSON 轉換過程中需要很多類的元數據,如果數據足夠小,則全部緩存到內存中。查表
當遇到多項選擇的條件時,要儘量使用查表法實現,比如 switch/case,C Array,如果查表條件是對象,則可以用 NSDictionary 來實現。避免 KVC
Key-Value Coding 使用起來非常方便,但性能上要差於直接調用 Getter/Setter,所以如果能避免 KVC 而用 Getter/Setter 代替,性能會有較大提升。避免 Getter/Setter 調用
如果能直接訪問 ivar,則儘量使用 ivar 而不要使用 Getter/Setter 這樣也能節省一部分開銷。避免多餘的內存管理方法
在 ARC 條件下,默認聲明的對象是 strong 類型的,賦值時有可能會產生 retain/release 調用,如果一個變量在其生命週期內不會被釋放,則使用 unsafe_unretained 會節省很大的開銷。
訪問具有 weak 屬性的變量時,實際上會調用 objc_loadWeak() 和 objc_storeWeak() 來完成,這也會帶來很大的開銷,所以要避免使用 weak 屬性。
創建和使用對象時,要儘量避免對象進入 autoreleasepool,以避免額外的資源開銷。遍歷容器類時,選擇更高效的方法
相對於 Foundation 的方法來說,CoreFoundation 的方法有更高的性能,用 CFArrayApplyFunction() 和 CFDictionaryApplyFunction() 方法來遍歷容器類能帶來不少性能提升,但代碼寫起來會非常麻煩。儘量用純 C 函數、內聯函數
使用純 C 函數可以避免 ObjC 的消息發送帶來的開銷。如果 C 函數比較小,使用 inline 可以避免一部分壓棧彈棧等函數調用的開銷。減少遍歷的循環次數
在 JSON 和 Model 轉換前,Model 的屬性個數和 JSON 的屬性個數都是已知的,這時選擇數量較少的那一方進行遍歷,會節省很多時間。
YYModel的特性
高性能: 模型轉換性能接近手寫解析代碼。
自動類型轉換: 對象類型可以自動轉換,詳情見下方表格。
類型安全: 轉換過程中,所有的數據類型都會被檢測一遍,以保證類型安全,避免崩潰問題。
無侵入性: 模型無需繼承自其他基類。
輕量: 該框架只有 5 個文件 (包括.h文件)。
文檔和單元測試: 文檔覆蓋率100%, 代碼覆蓋率99.6%。
YYModel的代碼
字典轉模型
@interface HelpModel : NSObject
@property(nonatomic,copy)NSString *title;
@property(nonatomic,copy)NSString *html;
@property(nonatomic,copy)NSString *ID;
@end
ps :導入NSArray分類
在VC中調用
打印出的部分結果
歸檔解檔
直接調用兩個方法
數據校驗與自定義轉換
原文鏈接:http://www.jianshu.com/p/514ffb83868d
著作權歸作者所有,轉載請聯繫作者獲得授權,並標註“簡書作者”。