一、性能對比
二、提升性能
1、緩存
Model JSON 轉換過程中需要很多類的元數據,如果數據足夠小,則全部緩存到內存中。
2、查表
當遇到多項選擇的條件時,要盡量使用查表法實現,比如 switch/case,C Array,如果查表條件是對象,則可以用 NSDictionary 來實現。
3、避免 KVC
Key-Value Coding 使用起來非常方便,但性能上要差于直接調用 Getter/Setter,所以如果能避免 KVC 而用 Getter/Setter 代替,性能會有較大提升。
4、避免 Getter/Setter 調用
如果能直接訪問 ivar,則盡量使用 ivar 而不要使用 Getter/Setter 這樣也能節省一部分開銷。
5、避免多余的內存管理方法
在 ARC 條件下,默認聲明的對象是 strong 類型的,賦值時有可能會產生 retain/release 調用,如果一個變量在其生命周期內不會被釋放,則使用 unsafe_unretained 會節省很大的開銷。
訪問具有 weak 屬性的變量時,實際上會調用 objc_loadWeak() 和 objc_storeWeak() 來完成,這也會帶來很大的開銷,所以要避免使用 weak 屬性。
創建和使用對象時,要盡量避免對象進入 autoreleasepool,以避免額外的資源開銷。
6、遍歷容器類時,選擇更高效的方法
相對于 Foundation 的方法來說,CoreFoundation 的方法有更高的性能,用 CFArrayApplyFunction() 和 CFDictionaryApplyFunction() 方法來遍歷容器類能帶來不少性能提升,但代碼寫起來會非常麻煩。
7、盡量用純 C 函數、內聯函數
使用純 C 函數可以避免 ObjC 的消息發送帶來的開銷。如果 C 函數比較小,使用 inline 可以避免一部分壓棧彈棧等函數調用的開銷。
8、減少遍歷的循環次數
在 JSON 和 Model 轉換前,Model 的屬性個數和 JSON 的屬性個數都是已知的,這時選擇數量較少的那一方進行遍歷,會節省很多時間。
三、應用
1、YYModel使用分類的模式,不需要去繼承在使用;
2、集成:在 Podfile 中添加 pod 'YYModel';
3、使用時引入YYModel.h文件即可;
demo: