這份教材在 2015 年時釋出,當中主要累積了我們從 2008 年到 2015 年這幾年之間的開發 經驗,以及 2011 年到 2015 年之間的內部訓練教材。從 2015 年開始,蘋果平台上的相關 技術也都變化巨大,我們也不見得有時間可以更新教材,所以在您閱讀這份教材的時候,我 希望您可以注意:
- 2015 年的時候 Swift 語言還並不穩定,而我們內部所開發的各種應用,都還是以 Objective-C 為主,所以這份教材花了大量時間解釋 Objective-C runtime 以及慣用的 pattern,從 2019 年回頭來看,隨著 Swift 語言與 ARC 的成熟,像是很多記憶體管理 相關的知識,其實已經不需要這麼多的篇幅,在最前面的幾章其實您可以選擇跳過。
- 由於 UIKit 是用 Objective-C 寫的,所以也大量使用 Objective-C 慣用的 pattern, 像是 Singleton、Delegate、Notification Center、KVO 等,不過,隨著 Swift 5.1 與 SwiftUI、Combine 等純 Swift 的 framework 的出現,蘋果也慢慢走向宣告式、React式 的程式設計典範,但如果你還是需要用到 UIKit,即使你寫的是 Swift,我還是希望這份 教材中講解的 pattern 可以對您有所幫助。
- 我們在公司內部已經大量使用 Swift,不過由於跟 Swift 有關的資源眾多,我們也就沒 有特地加上與 Swift 有關的教材,所以最近的一些更新還是因應我們內部的特殊需求為 主,像是與音訊處理相關的部份。
由於我們身在台灣,在這本書當中也採用台灣慣用的技術名詞,所以如果您習慣簡體中文, 可能會不習慣當中的一些名詞。大抵上的對應如下:
- 實作 -> 實現
- 物件 -> 對象
- 檔案 -> 文件
- 記憶體 -> 內存
- 記憶體漏水 -> 內存洩漏
- 迴圈 -> 循環
- 指標 -> 指針
這份教材
- 位置是 https://zonble.gitbooks.io/kkbox-ios-dev/content/
- 同時也放在 https://kkbox.github.io/kkbox-ios-dev/
- 資料都放在 GitHub 上 https://github.com/KKBOX/kkbox-ios-dev
您如果發現任何的錯誤,可以直接在 GitHub 上發 Pull Request 修改,如果您有什麼問 題,也可以寫信到 zonble @ gmail . com 。
這份教材是為了 KKBOX iOS/Mac OS X 開發部門的新人訓練所設計,目的是培養出可以開 發、維護 KKBOX 的 iOS 與 Mac OS X 版本,以及我們其他軟體產品的工程師。
這不太算是一本入門的教材。編寫這份教材的時候,我們假設的讀者是已經寫過半年左右的 iOS 程式,甚至有一兩個 App 在架上,因為畢竟是為了新人訓練所設計,要我們雇用完全 沒有經驗的 iOS 工程師,我想也很困難(其實也有這樣的案例,但真的為數不多)。所以 我們假設在使用這份教材之前:
- 你已經會操作 Mac 電腦,也知道怎麼安裝 Xcode
- 你已經知道一些 Objective-C 語法
- 你已經知道一些 Foundation 物件怎麼使用
- 你已經知道怎樣使用一些 UIKit 物件
- 你會使用 Quartz 2D 畫圖
- 你知道怎麼處理在 iOS 裝置上實機執行的 certificate 與 provision profile
這份教材的主要方向是把一些 iOS 工程師天天都在使用,但往往模模糊糊懵懵懂懂的觀念 說清楚,首先從 Objective-C 這門語言是怎麼運作講起,再進一步講解在 iOS 與 Mac OS X 裝置上的 GUI App 如何運作,中間也會帶過一些重要的 Design Pattern,在閱讀的過程 中再搭配實際練習,透過 coding 實際體會這些重要概念,最後具備有 coding,以及能夠 清楚解決各種問題的能力。
我們所重視的不是如何快速上手,不是如何用 CocoaPods 或 Carthage 的套件拼出一個 App,而是偏重由下而上(Bottom-up)的學習:先了解整個開發框架的底層,以及整個框架 的基本觀念,然後才去一個個去看在這個框架中有哪些API、以及有哪些第三方 library 可 以使用。
這和我們的工作型態有關,在一些以專案為主的公司裡頭,可能注重的是如何快速完成專 案、如何以最快的速度完成新 App,交付 App 之後就不再維護。但KKBOX 算是一個有一些 年紀的產品,我們在 2008 年九月推出第一版 Mac OS X版本,在 2009 年一月推出第一版 iOS 版本,一路從 Mac OS X 10.4、iPhoneOS 2 的時代寫到現在,我們會花上許多時間解 決、並且避免軟體中出現的問題。而要對系統到底怎麼運作要有一定的認識,才能夠知道怎 樣閱讀 crash report,知道怎麼辨識問題並修正。
iOS 的技術不斷變動,我們也多從不太會變動的基礎概念著手。不過,我們也會按照 KKBOX 自己的需要以及技術的改變,隨時擴充或改變這份教材的內容。
同時,不同於坊間大多數的 iOS 開發書籍,因為 KKBOX 同時有 iOS 與 Mac OS X 的版 本,在這份教材中,我們會同時講到 iOS 與 Mac OS X,但如果同一個重要觀念同時出現在 iOS 與 Mac OS X 中,會以 iOS 為主。
在程式語言上,我們先講解 Objective-C,因為我們的主要產品大部分的 code還是用 Objective-C 寫成的,只有使用少量的 Swift。而就我們的經驗,學過Objective-C 之後, (只要搞定了 Optional 這個語言特性)轉換到 Swift 上也不會花太多的時間。而且,就 算先學了 Swift 語法,還是得搞清楚 selector、protocol、delegate 等,而這些概念 Swift 與 Objective-C 還是互通的。
在各種 API 與 library 的介紹上,也以 KKBOX 產品中會用到的為主,像我們在這份教材 中,會打算講 Audio 相關的部份,絕大多數的 iOS 開發者可能並不需要知道如何在 iOS 上處理 Audio,但 KKBOX 是一家做音樂服務的公司。至於像遊戲開發等,雖然我們之前也 用過像 Cocos2D 這些功能做過一些小專案,但不會在這邊佔上篇幅,畢竟這份教材完全是 為了 KKBOX 的需要而打造。
其實在這份教材中絕大多數材料,都可以在蘋果文件與 WWDC 影片中找到,其實蘋果官方的 文件比絕大多數的書籍都還要好,但這些資料非常多,當你想直接從蘋果文件學習開發的時 候,這份教材也提供一份怎樣在文件之海中探索的方向。
雖然在敘述上,我們只能夠按照章節順序排列,但是在整個 Cocoa Framework中,許多觀念 其實互為因果或是互相糾纏,所以在某個章節中,可能會事先講到跟後面章節有關的事情, 但是先不要介意,如果遇到這樣的狀況,我們會在後面繼續說清楚。