前言
話說前言都是用來扯淡的,無論是記筆記還是分享給別人看,前言的扯淡讓自己再次讀起來能回想起當時寫下此文的心情;讓別人讀起來最大程度上和分享者達成共識,那就扯上幾句
無可厚非,讀優秀的源碼是提高自己快捷而有效的方式;如何讀到優秀的源碼?直白點說找github星星最多的項目。雖說有很多項目存在刷star的嫌疑,但是,github上面上萬star的項目也不是刷星就能刷出來的。其次,上萬star的項目也很多,能都全部讀懂并深入理解也已經很厲害了吧。
最后說明:文章是對自己解讀源碼的一些記錄。
緣由
- 英文比較渣
- 有c/c++語言功底不能浪費
- 項目中引入三方庫,出現bug調試時跟蹤到三方庫的調用都會跳過,以至于一個bug調試會浪費很多時間在猜測和不斷跟蹤代碼中
- 最不能忍的是,三方庫引入其他三方庫,莫名其妙的一個小功能引入一大堆東西
- 最重要的也許是,我為什么要使用三方庫(為什么不能自己去實現)
由此,從學Objective-C開始,就嘗試了以各種方式讀源碼,有些開源庫會因為解讀的方式不對,前前后后使用了很多方式,大多方式都會因為不符合而中途中斷。錯誤的方式,堅持的越久越讓人產生壞的情緒,給人以挫敗感。尤其是我這種需要通過成就感來不斷前進的人。
iOS開發100個優秀開源項目
iOS GitHub Top 100是CocoaChina推送的,雖說CocoaChina被大牛稱為新手樂園,但是也一直在努力給我們這些新手更好的東西。大概看了下,有AFNetworking,Masonry,SDWebImage等大部分項目必備的,也有ASIHTTPRequest等停更的,還有一些可用可不用的項目??傮w來說,根據自己的需求挑選著閱讀吧。
iOS開源項目 是一個大牛整理在Github上的iOS開發的開源庫,包含了很多東西。大部分是Objective-C的源碼,有些東西也比較老了。但是,還是有很多有用的東西,也許里面的源碼自己可以維護一下為自己項目服務,或者某些項目會提供給你一個好的思路來開發自己的項目。
源碼閱讀嘗試
- 先框架,后分解
這是從C++轉過來嘗試的第一種方式,當初讀的第一個iOS項目是AFNetworking,我想嘗試通過讀源碼來快速熟練Objective-C的使用,無疑我高估了自己的能力,也選錯了項目。
方法簡述:
通過開源項目簡介了解到項目的用途
通過給出的示例進行簡單測試以熟悉它的用法
開始真正的項目分析,流程有三步:
1 一般的開源項目會包含在一個文件夾中,與文件夾同名的會有一個.h文件,這個文件中一般會包含很多頭文件(這些頭文件大部分會是分析入口),使用者只要包含一個頭文件即可。
2 根據類文件和類文件中的注釋大概了解到這個類的作用(有些開源項目會提供文檔),并對每個類的作用進行了劃分。
3 暫時不去了解每一個方法的具體實現,從入口開始分析,跟蹤方法的調用流程,然后擴展到對每個接口進行如此分析。
失敗總結:
Objective-C語法還不能熟練使用就開始讀源碼
選擇了AFNetworking這個代碼量相對比較大,而且需要對http協議有深入理解的項目
對AFNetworking還不能熟練使用,這也許是最重要的一點(想要深入,必須先熟練使用)
有一部分功能必須知道在具體實現里面做了什么事,才能繼續分析調用流程
還有個人的一個壞習慣,讀代碼記錄的筆記不整理,等再次讀這個開源項目的時候,筆記不是被自己刪了,就是找不到了。
2.先了解功能,再測試方法,最后分析如何實現
這是在可以寫一個iOS項目后的嘗試(也算是第二次嘗試), 由于當時仿寫網易新聞客戶端,請求過來的圖片包含gif圖,當gif圖片顯示到界面上的時候,模擬器內存暴增而且并不會下降,滾動到300-400M左右app就崩潰了。因此,開始研究SDWebImage這個開源庫。
方法簡述:
由于項目中對SDWebImage的使用比較單一,只針對有一個接口進行了大量的調用。
因此根據之前的方式走到了第三部,開始針對一個接口進行詳細的分析。
失敗總結:
這個方式看似是成功的,確實針對這一個接口進行了全面分析,也明白了具體的工作流程。但是,也僅限于這一個接口。SDWebImage這個開源庫無疑是優秀的,里面除了對圖片進行下載,還有專門的緩存處理,而針對緩存這部分足以封裝為一個單獨的三方庫。
3.前段時間看到有人分享了閱讀源碼的方式,根據開源項目Github提交的版本從最早到最新的進行chekout,并開始閱讀(也就是從1.0到2.0,再到3.0,因為最早的版本,功能相對都比較少,代碼量就比較小)
總結:
首先,這個并不算自己嘗試的一種吧,因為讀過AFNetworking2.X版本的代碼和AFNetworking3.0的代碼。由于iOS9.0后為了安全使用了https,導致2.X到3.0的升級變動還是挺大的。雖然2.X版本已經引入了NSURLSession并封裝了類,但是,大部分開發者并沒有使用,因此2.X的代碼量相對3.0大了不少,對于第一次讀源碼的人,如果從2.X讀可能就搞不明白。相對來說,3.0則直接移除了舊的類,全部使用了NSURLSession,代碼量也減了不少。
其次,每個人讀取源碼的思路是不一樣的。針對自己,拿到源碼首先希望對其有個整體的認知,了解其如何架構,這雖然在前期會花費很多時間。但是,隨著后續對代碼的閱讀,無疑是可以快速的上手的。
4.這是最近的一次嘗試(算是第三次吧),盡管中間也有其他嘗試,但是都因為方式不適合自己而放棄。而這次,也是因為對Objective-C的熟練掌握,以及經過幾個項目的磨練,在對三方庫的使用上也有了新的認知(不要重復造輪子:在自己認為,當自己技術達到一定的水平后,不要去重復的寫一些沒有意義的東西;找現成的三方庫或代碼片段,去重構)。
方法簡述
依舊沿用前面的方式:
首先,根據類文件進行劃分;
其次,找到入口處,對業務模塊進行劃分;
再次,針對每一個分支了解到其調用流程,在這一步劃分時跟蹤代碼很容易亂,跟著跟著就看不懂了(只能說自己功底還是不夠深)。針對這個問題,專門對代碼做了2個備份:一個用來參考,一個用來刪除(不用的都刪除,細節功能都刪除,因為往往混淆的都是這些封裝的小功能函數)。
最終,把一個業務分支的流程都顯示在一屏中,過長的方法則收縮起來,然后參考這個流程,在另一份代碼中跟蹤代碼梳理流程。