偶然間看到Y(jié)YKit,Google一下牧氮,我的天扒砬弧!漫天的贊嘆聲踱葛,再打開源代碼一看丹莲,感覺自己沒有敲過代碼,決心好好整理自己的心情尸诽,遂打開源碼好好學(xué)習(xí)一番甥材。
** ibireme**和YYKit
可以看一下唐巧對ibireme的采訪
搜索一下ibireme的微博
簡言之,渴望成為iOS大牛的新人逊谋,只有兩條捷徑擂达,一是大量地閱讀優(yōu)秀項(xiàng)目的源代碼,另一個就是自己動手實(shí)踐來嘗試胶滋。
YYKit
YYKit 是一組龐大、功能豐富的 iOS 組件悲敷。
為了盡量復(fù)用代碼究恤,這個項(xiàng)目中的某些組件之間有比較強(qiáng)的依賴關(guān)系。為了方便其他開發(fā)者使用后德,我從中拆分出以下獨(dú)立組件:
- YYModel — 高性能的 iOS JSON 模型框架部宿。
- YYCache — 高性能的 iOS 緩存框架。
- YYImage — 功能強(qiáng)大的 iOS 圖像框架瓢湃。
- YYWebImage — 高性能的 iOS 異步圖像加載框架理张。
- YYText — 功能強(qiáng)大的 iOS 富文本框架。
- YYKeyboardManager — iOS 鍵盤監(jiān)聽管理工具绵患。
- YYDispatchQueuePool — iOS 全局并發(fā)隊(duì)列管理工具雾叭。
- YYAsyncLayer — iOS 異步繪制與顯示的工具。
- YYCategories — 功能豐富的 Category 類型工具庫落蝙。
YYModel的學(xué)習(xí)
iOS開發(fā)總會用到各種JSON模型轉(zhuǎn)換庫织狐,本人最常用的MJExtension(小碼哥出品),轉(zhuǎn)換效率很高暂幼,使用也比較簡單,只要前后臺約定好移迫,json直接就轉(zhuǎn)成了model旺嬉。另外還有JSONModel,Mantle厨埋,F(xiàn)astEasyMapping邪媳,Manually等等。關(guān)于這幾個庫的測評荡陷,可以點(diǎn)擊ibireme的iOS JSON 模型轉(zhuǎn)換庫評測雨效。
《iOS JSON 模型轉(zhuǎn)換庫評測》
本文中ABCDE表示等級,A為最佳亲善,E為最差(僅為個人學(xué)習(xí)用)
性能 | 容錯性 | 功能 | 侵入性 | |
---|---|---|---|---|
Mantle | E | B 會進(jìn)行對象類型檢查 | A 可定制性最高 | B 需要 Model 繼承自某個基類设易,靈活性稍差,但功能豐富 |
JSONModel | C 和 MJExtension 差不多蛹头,Mantle 性能高 | D 沒有對錯誤類型的檢測顿肺,沒有對 App 的保護(hù) | B 使用比較簡單,但功能相對 Mantle 稍弱 | B 需要 Model 繼承自某個基類渣蜗,靈活性稍差屠尊,但功能豐富 |
MJExtension | C 和JSONModel 差不多,Mantle 性能高 | C 對部分對象進(jìn)行自動轉(zhuǎn)換 | B 使用比較簡單耕拷,但功能相對 Mantle 稍弱 | A- Category 方式來實(shí)現(xiàn),添加了一些沒有前綴的方法讼昆,易引起沖突 |
FastEasyMapping | B 較快 | E 沒有自動轉(zhuǎn)換的機(jī)制 | C 功能最少,使用也不算方便 | C 采用工具類來實(shí)現(xiàn)骚烧,使用靈活浸赫,但不方便 |
YYModel | A 快,接近手寫代碼的效率 | A 會進(jìn)行對象類型檢查 | B 使用比較簡單赃绊,但功能相對 Mantle 稍弱 | A Category 方式來實(shí)現(xiàn) |
附錄:原文中關(guān)于YYModel的幾個優(yōu)化tips不錯既峡,大家可以學(xué)習(xí)一下!
- 緩存
Model JSON 轉(zhuǎn)換過程中需要很多類的元數(shù)據(jù)碧查,如果數(shù)據(jù)足夠小运敢,則全部緩存到內(nèi)存中。
- 查表
當(dāng)遇到多項(xiàng)選擇的條件時忠售,要盡量使用查表法實(shí)現(xiàn)传惠,比如 switch/case,C Array稻扬,如果查表?xiàng)l件是對象卦方,則可以用 NSDictionary 來實(shí)現(xiàn)。
- 避免 KVC
Key-Value Coding 使用起來非常方便腐螟,但性能上要差于直接調(diào)用 Getter/Setter愿汰,所以如果能避免 KVC 而用 Getter/Setter 代替困后,性能會有較大提升。
- 避免 Getter/Setter 調(diào)用
如果能直接訪問 ivar衬廷,則盡量使用 ivar 而不要使用 Getter/Setter 這樣也能節(jié)省一部分開銷摇予。
- 避免多余的內(nèi)存管理方法
在 ARC 條件下,默認(rèn)聲明的對象是 __strong 類型的吗跋,賦值時有可能會產(chǎn)生 retain/release 調(diào)用侧戴,如果一個變量在其生命周期內(nèi)不會被釋放,則使用 __unsafe_unretained 會節(jié)省很大的開銷跌宛。
訪問具有 __weak 屬性的變量時酗宋,實(shí)際上會調(diào)用 objc_loadWeak() 和 objc_storeWeak() 來完成,這也會帶來很大的開銷疆拘,所以要避免使用 __weak 屬性蜕猫。
創(chuàng)建和使用對象時,要盡量避免對象進(jìn)入 autoreleasepool哎迄,以避免額外的資源開銷回右。
- 遍歷容器類時,選擇更高效的方法
相對于 Foundation 的方法來說漱挚,CoreFoundation 的方法有更高的性能翔烁,用 CFArrayApplyFunction() 和 CFDictionaryApplyFunction() 方法來遍歷容器類能帶來不少性能提升,但代碼寫起來會非常麻煩旨涝。
- 盡量用純 C 函數(shù)蹬屹、內(nèi)聯(lián)函數(shù)
使用純 C 函數(shù)可以避免 ObjC 的消息發(fā)送帶來的開銷。如果 C 函數(shù)比較小白华,使用 inline 可以避免一部分壓棧彈棧等函數(shù)調(diào)用的開銷慨默。
- 減少遍歷的循環(huán)次數(shù)
在 JSON 和 Model 轉(zhuǎn)換前,Model 的屬性個數(shù)和 JSON 的屬性個數(shù)都是已知的弧腥,這時選擇數(shù)量較少的那一方進(jìn)行遍歷业筏,會節(jié)省很多時間。
YYModel的特性
高性能: 模型轉(zhuǎn)換性能接近手寫解析代碼鸟赫。
自動類型轉(zhuǎn)換: 對象類型可以自動轉(zhuǎn)換,詳情見下方表格消别。
類型安全: 轉(zhuǎn)換過程中抛蚤,所有的數(shù)據(jù)類型都會被檢測一遍,以保證類型安全寻狂,避免崩潰問題岁经。
無侵入性: 模型無需繼承自其他基類。
輕量: 該框架只有 5 個文件 (包括.h文件)蛇券。
文檔和單元測試: 文檔覆蓋率100%, 代碼覆蓋率99.6%缀壤。
YYModel的代碼
字典轉(zhuǎn)模型
@interface HelpModel : NSObject
@property(nonatomic,copy)NSString *title;
@property(nonatomic,copy)NSString *html;
@property(nonatomic,copy)NSString *ID;
@end
ps :導(dǎo)入NSArray分類
在VC中調(diào)用
打印出的部分結(jié)果
歸檔解檔
直接調(diào)用兩個方法