iOS 開發技術棧與進階

最近有一些開發朋友問我應該怎樣提高本身的能力,回想起來作了這麼久 iOS 開發,我也有過那種「讓我作一個功能實現個需求我會作,但接下來怎樣提升我不知道。」的時期,這裏嘗試列一下 iOS 開發的相關技術,再說說在學習進階上個人一些想法。前端

iOS 技術棧

這裏按個人理解給 iOS 相關技術分個類,以工程實現的角度,分紅了基礎、需求、效率、質量四個類別。基礎指程序開發和 iOS 開發的基礎知識和技能,需求就是產品的需求,有了基礎技能,實現了產品需求後,剩下的事情就都是爲了提升項目質量和提高開發效率。git

大體的思惟導圖程序員

基礎

基礎包括語言、框架、內存、網絡、存儲、渲染、線程。web

語言目前 iOS 開發就是 OC 和 Swift,國內仍以 OC 爲主,對於 OC 除了語法外,最好了解它的對象模型,動態機制等特性。Swift 方面若要在團隊裏使用,目前仍是風險大收益小的,但我的最好保持對它的關注。面試

框架就是 Foundation / UIKit 以及蘋果系統封裝好的各類框架,Foundation 和 UIKit 每一個作 iOS 開發的人都熟知這套,iOS 功能愈來愈多,蘋果提供的框架也愈來愈多,像 StoreKit / MessageUI / AVFoundation 等能夠在使用到再去了解。算法

接着是客戶端裏最多見流程裏的四個關鍵部分:從網絡拉取數據,存儲到本地文件系統,再從本地取出來放進內存,最後渲染出來。而這裏全部的處理都在操做系統的進程和線程中執行。sql

網絡方面若要深刻的話內容不少,客戶端通常只須要關心 http / https / dns 這幾個協議,瞭解 https 的原理,處理運營商劫持 dns 劫持等狀況,另外須要處理好各類異常狀況作好重試機制,iOS 做爲移動端網絡不穩定,要看狀況優化弱網絡下的鏈接,作好離線機制,以及注意避免耗費太多流量。還有客戶端跟後臺的通訊協議,數據結構通常用 json 或 protobuf,因爲客戶端本地會保存一部份內容,不少 APP 都會須要作數據的增量更新。數據庫

存儲方面主要是 sqlite,sqlite 做爲存儲引擎是大多數 APP 的核心,也是性能優化的關鍵點,最基本的須要知道主鍵索引事務等數據庫基本概念,再深刻須要瞭解具體的存儲機制/索引的實現/sqlite的七層結構等,才能在遇到問題時找到最佳的解決方案。客戶端上 nosql 用得較少,除了 sqlite 通常就剩單文件存儲,XML存文件或對象序列化成二進制存儲,也是經常使用的存儲方式,近期有 realm 這種新型數據庫,也值得了解一下。編程

內存方面,須要瞭解 OC 的引用計數、 ARC 機制、自動釋放池等相關點,最好其餘語言的垃圾回收機制也有所瞭解,另外須要注意避免內存泄露,管理好客戶端的緩存,避免緩存太多致使OOM,或緩存命中率過低性能低下。json

渲染方面主要是文字和圖像,基礎上文字方面 UIKit 已封裝得很好,CoreText也提供了更自由的排版渲染方式,圖像渲染只須要注意解壓時機,再深刻須要瞭解 iOS 具體的渲染機制,像圖層混合,渲染時機,離屏渲染等,纔好作更多的優化。

線程和進程方面,iOS 開發只在作 Extension 時才須要考慮到進程,通常只需處理好線程,須要瞭解主線程子線程,多線程併發鎖競爭,死鎖,GCD,Runloop 等知識點。

  • iOS開發生態交流技術羣:679884541,無論你是小白仍是大牛歡迎入駐 ,分享BAT,阿里面試題、面試經驗,討論技術, 你們一塊兒交流學習成長!
  • (直接搜索或點擊羣號:679884541 快速入羣)

需求

需求方面姑且歸納爲普通需求、特殊需求和運營需求。

普通需求就是上面提到的網絡拉數據->存儲->讀取->展現,大多數 APP 主要都是在實現這類需求,熟悉上述的基礎知識後就能輕易實現。

特殊需求是指一些特定 APP 的需求,像瀏覽器內核,文字排版引擎,音視頻和圖像處理引擎,圖標繪製引擎等,要求較高,都須要在相關領域裏較深刻的鑽研才能作好。

運營需求是 APP 上線後持續運營過程當中的需求,包括功能動態化,能夠隨時增刪改線上的功能,通常這塊由內嵌 web 承擔。配置系統也算動態化的一種,能夠經過各類開關控制展示的功能。統計系統記錄 APP 各項運營數據,包括用戶增加狀況,留存率,功能使用狀況等。事件流能夠清楚看到用戶在 APP 裏的使用流程。有些 APP 還會開發推薦系統,根據收集來的數據給不一樣用戶推送不一樣內容,提升用戶轉化率等。

質量

越大的 APP 會花越多的精力在保證和提升 APP 質量上,包括性能優化,搭建監控體系,提高代碼質量,保證安全,以及經過測試保證質量。

性能優化範圍很大,在網絡/存儲/內存/渲染/算法各方面都有優化的可能,通常性能上的優化能夠分紅三步走,一是檢測各方面的數據,量化運行性能,二是從中找到性能瓶頸,三是找辦法優化,用第一步的數據驗證優化效果。

監控體系在面向大衆用戶的產品裏不管是前端後端一直都是很是重要的,你須要時刻知道用戶在使用你的產品過程當中有沒有發生什麼問題,讓你的 APP 處於可知可控狀態,客戶端最多見的監控點是 crash,這個無需多說,另一般對於 APP 裏的錯誤碼,包括本地錯誤、網絡錯誤等都須要監控起來,這樣在出現異常時才能即時得知進行處理。其餘通用的監控包括卡頓監控、數據庫監控、流量消耗監控、內存消耗監控、各類耗時監控等等,還有各種業務相關的監控,越大的 APP 監控的項目就越多越細緻,目的都是及時發現問題,以及衡量 APP 的質量。除了監控問題外,這裏還須要作好出錯時的補救措施,能夠經過預埋功能開關配置或接入熱修復的庫去作。

安全方面,客戶端上安全的份量相對於服務端是少不少,尤爲是在 iOS 系統沙盒機制的保護下,自己已經比較安全,最須要注意的是網絡傳輸的安全,避免網絡傳輸內容被篡改,或泄露了用戶名密碼等敏感信息。對於代碼裏有機密信息的能夠考慮混淆代碼對 APP 進行加固,減小被破解的機率。

代碼質量主要存在於團隊協做上,通常團隊都會定義代碼規範,讓你們的代碼風格趨於一致,有些會開發代碼規範檢測工具,確保提交的代碼遵循代碼規範。另外不少團隊都會實行 code review 機制,互相查看代碼,減小髒亂差代碼出現的機率,具體 review 機制各有不一樣。

測試是一個專業,國內終端產品由於迭代快,常見的是黑盒測試,雖然不能保證無問題,但成本低效率高,部分穩定的核心功能會作單元測試,也有一些團隊全部業務功能都作自動化測試的。

效率

客戶端的架構能夠說都是爲了提升開發協做效率,由於功能能夠用不少種方法實現,能夠不須要什麼架構,不管是大型仍是小型 APP 均可以按一套來實現,只不過差的架構在中大型 APP 上代碼會很混亂,致使在開發/協做/debug上效率會愈來愈低,好的架構則會提高這裏的效率。大多數架構都是分層抽象和解耦,把功能獨立的組件抽離出來,業務模塊化,分層職責清晰,互相不耦合。只要分層抽象和解耦作得足夠好,不管多大的 APP 都是不少小模塊的拼接,就能夠下降複雜度,提升開發效率。但有時解耦會帶來通訊的麻煩,抽象也有粒度大小的問題,這些都須要根據具體狀況權衡。業界有各類各樣的架構模式可供參考,像 MVC / MVVM / MVP / VIPER 等。除了解耦和抽象,還有一些改變編方式的架構,像響應式編程,單向數據流等。

持續集成的意思是不斷把每一個人作的東西(代碼/資源等)集成到一塊兒輸出成品,進行自動化構建,其中涉及代碼管理(git / svn),編譯流程,證書和簽名機制,自動化測試,打包發佈等。其中還會有一些自定義的自動化流程,例如自動生成代碼,根據 debug / release 包類型自動更改配置等,重複作的事都應該自動化,以提升開發效率。

業界爲了提高開發效率,跨平臺開發一直是你們孜孜不倦追求的目標。終端上跨平臺願望是隻開發一次,就能完美運行在 Android 和 iOS 上,業界有不少嘗試,這篇文章總結得比較全,總的來講目前最好的跨平臺方案就是 web (H5),代價是性能略低。

進階

列完 iOS 開發的相關知識點,接下來講說怎樣學習提升。

若是自學能力強的話,不須要多說,上述每一個點網上都有大量資料,像內存網絡存儲這些計算機基礎知識也有經典的書籍,一個個啃下去就好了,只要理解得足夠深刻,就已經能夠成爲領域裏的專家,並很容易舉一反三。

但這種學習方法會比較枯燥,也難以實踐,我的仍是比較推薦在實踐中學習,具體來講就是在平時開發過程當中不斷地發現問題 -> 解決問題

發現問題

首先你最好處在一個有不少工程上的問題急需解決的環境裏,這樣發現問題就很容易,最好的是處於這幾類項目裏:

  1. 處於高速發展期的項目。增加會帶來不少問題,一切又未成熟,解決這些問題是很是天然又有價值的。
  2. 龐大的項目,超級APP會帶來不少中小型APP沒有遇到過的問題,又由於體量大,就算只有千分之一的人遇到也會影響幾十萬人,頗有解決的價值,會有不少細緻的問題。
  3. 像上面提到的有「特殊需求」一類的項目,須要在一個領域裏深刻研究,也會天然碰到不少問題。

若是恰巧沒有在這三種類型的項目裏,也不要緊,只要是健康發展的項目,總會存在問題和優化空間,只是要培養髮現問題的意識,不少時候問題就在那裏,但沒人發現它,沒人以爲它能夠/應該解決。能夠按上述列的點,在相關點上多問本身能不能提升效率和質量,例如能不能提升先後臺聯調效率,重複寫的代碼能不能自動生成,啓動耗時能不能短一點,線上問題發現和排查的效率能不能提升等等。各類問題會涵蓋上述提到的全部知識點。

若是不幸你的項目沒有健康發展,實在沒碰到什麼問題或者問題不值得解決,或者你還沒畢業,那這裏還有一個萬能問題可供參考:那些知名的開源項目具體是怎樣實現的?剖析開源項目源碼能夠學到不少東西,各類各樣的開源項目也覆蓋了不少知識面,只要深刻去研究它們,學習它的架構和編碼,不懂的地方再去補齊知識,也是個很好的學習方式,若是學習後能輸出文章效果會更好,至關於動手實踐了。

解決問題

不一樣的解決問題的方式差異很大,有一些常見的套路可供參考:

1. 業界是怎樣解決這個問題的?他們的方案有什麼不足?我怎樣能夠作得更好?
業界有各類各樣的開源庫和技術分享,只要問題不是太偏門,大多會有人已經提出解決方案,多對比和研究這些已有的方案,看它們是否能知足需求,找出它們的優勢和不足,看看能不能作得比它們更好或更適合解決碰到的問題。

2.解決方案可否通用化,封裝成開源庫供其餘項目使用?
開源項目都是這樣來的,若是遇到一個別人沒解決好的問題,別錯過封裝成開源庫造福社會。

3.有沒有辦法防止之後出現相似的問題?
有些問題可能會反覆出現,能不能防止,或者能不能在出現問題的時候能及時發現和修復,這可能涉及到開發流程、自動化和監控體系等方面的完善。

4.總結沉澱
能不能總結出解決這類問題的方法論(套路)?最好能輸出文章或分享,寫的過程是很好的學習過程,由於要把本來模糊的想法都清晰地表達出來,迫使本身去整理思路。

  • iOS開發生態交流技術羣:679884541,無論你是小白仍是大牛歡迎入駐 ,分享BAT,阿里面試題、面試經驗,討論技術, 你們一塊兒交流學習成長!
  • (直接搜索或點擊羣號:679884541 快速入羣)

總結

這裏按個人理解列了 iOS 相關技術點,以及在實踐中提高能力的一點小建議,可能沒法各方面都覆蓋到,只是做爲一個參考。另外這裏只侷限在 iOS 開發上,實際上做爲程序員不該該限制本身學習的範圍,有時間多去了解後端/前端/運維也會頗有利於自身開發能力的提升。

相關文章
相關標籤/搜索