⑴ iOS源碼解析—YYModel(NSObject+YYModel)
iOS源碼解析—YYModel(YYClassInfo) 分析了如何根據OC的Class對象構建YYClassInfo對象,為接下來的JSON數據和Model轉換作準備,這篇文章開始講解NSObject+YYModel。
分析NSObject+YYModel.h文件,包括3個Category和一個protocol,分別是:
字典studentDic中的key對應原字典playerDic中的key,studentDic中的Model由playerDic中的value轉化得到。
首先定義了兩個類,_YYModelMeta和_YYModelPropertyMeta,分別封裝了Model的信息和Model中各屬性的信息。
_YYModelMeta維護了Class的相關信息,下面是注釋:
_YYModelMeta是通過YYClassInfo對象的信息構建得到的。首先調用metaWithClass:cls方法,該方法如下:
維護了一個鍵值對cache作為緩存,用cls作為key,調用CFDictionaryGetValue方法去緩存中查找,如果有,直接返回構建好的_____YYModelMeta對象,如果沒有找到或者needUpdate屬性標記為true,則根據cls創建一個新的_YYModelMeta對象,並且存入緩存。這樣不需要每次都創建,提高了性能。
接下來看一下initWithClass:方法,
下面分析幾個重要的方法:
YYModel的總體思想是以Model屬性的類型為准,如果JSON中對應名稱的value的類型和Model屬性類型不一致,會對value的類型進行轉化,保證和Model屬性的類型一致。如果兼容不了,不進行屬性賦值。下面分析一下ModelSetValueForProperty方法:
該方法上文中提到該方法是用來JSON轉成Model的過程中對Model中的屬性進行賦值的方法,該方法做了部分基本類型的兼容:
YYModel還提供了一些工具方法,下面簡單分析一下:
YYModel作為一個負責JSON數據和Model轉化的庫,十分易用和高效,特別是做了一些類型的兼容和轉化,避免了服務端介面數據類型和客戶端Model對象類型不兼容導致的問題,例如執行了不存在的方法而導致崩潰。另一方面,對YYModel的學習在一定程度也促進了對runtime機制的學習和了解。
關於YYModel的分析到這兒先告一段落,由於本人的iOS基礎有待提升,再加上表達能力有限,文中許多地方的分析和思路,表達的不是很准確和清楚,希望通過今後的學習和練習,提升自己的水平。
⑵ 安卓平台屬於動態庫操作嗎
屬於
靜態庫全稱靜態鏈接庫,動態庫全稱動態鏈接庫,看到全稱就知道什麼意思了吧?也就是說在鏈接的時候才會用到的庫,只有C/C++、OC語言才會有鏈接過程,java沒有。
在android中說到靜態庫和動態庫,一般說的都是C/C++代碼,我們知道在android中是通過jni技術訪問到C代碼的,我們會把C/C++打包成so文件,這個就是動態庫(共享庫)。如果我們想要使用的C庫是.a形式的靜態庫時,我們要把.a包裝成so庫,具體網上有方法。
個人感覺在java語言中討論靜態庫和動態庫就是個偽概念,java是的編譯結果是位元組碼文件,不是二進制文件,而且沒有鏈接的過程,jvm在解釋執行java代碼的時候調用C++代碼只能是動態的。
在C++和object C開發中,用編譯鏈接的過程,靜態庫在鏈接過程中,會和自己寫的源代碼打到一塊,多個程序多個靜態庫。動態庫不會打到一塊,如果有共享情況的話,系統只會載入一次。
OC的代碼處理過程是很復雜的,有預處理、編譯、鏈接過程,預處理就是處理宏什麼的,編譯這個過程就很復雜了,有編譯前端和編譯後端,編譯稱機器碼(中間還會有匯編的過程),鏈接就是鏈接動態庫或者靜態庫。
Android(java)代碼處理過程就很簡單啦,畢竟是運行在虛擬機上的。沒有所謂的預處理,直接編譯,這里的編譯也就是把java代碼轉化成位元組碼,這個編譯和OC中的編譯可不是一個概念,只不過也這么叫而已。後續Aandroid還會用dex工具把.class打包成.dex,不同的VM模式(5.0以後都是ART)會對.dex進行不同的優化,具體看Android 編譯到運行APK過程總結。需要提一下的是,ART採用AOT和JIT技術,在安裝或者運行的時候,會把位元組碼轉化成機器碼,這個機器碼也會受VM控制的,具體看Android之Dalvik 、ART
C/C++、Object C屬於編譯型語言,這是毋庸置疑的,因為它們都會在生成安裝包之前編譯成機器碼。
⑶ iOS 的 framework 和 ipa 文件可以反編譯出源碼嗎
ipa 文件其實是一個壓縮包,裡麵包括了可執行文件,資源文件等信息。
反編譯的話也可以,只是你要有足夠強的功底,就可以。這個至少匯編得會吧,然後可以根據反編譯出來的匯編寫出原來的OC程序。現在我沒有發現有什麼工具可以直接反編譯出ELF文件的。
框架(framework)是一個基本概念上的結構,用於去解決或者處理復雜的問題。這個廣泛的定義使用的十分流行,尤其在軟體概念。框架也能用於機械結構。