內容簡介
《iOS開發進階》分工具、實踐、理論三大部分。第一部分介紹iOS 開發的常用工具,第二部分介紹iOS開發中的一些常見的實踐經驗,第三部分介紹iOS 開發中涉及的原理。
如果把成為iOS 開發高手的過程比作武俠小說中的修煉過程的話,工具、實踐和理論的學習就分別對應兵器、招式和內功的修煉。《iOS開發進階》希望通過這三方面的綜合講解,全面提高開發者的技能水平
編輯推薦
全面提高開發者的技能水平,工具|實踐|理論一步到位;
結合國內特有的開發需求,為iOS開發者量身打造;
國內唯一iOS開發微信公共帳號運營者首次經典分享;
真正適合iOS中、高級開發者的進階讀物。
內容提要
《iOS開發進階》分工具、實踐、理論三大部分。第一部分介紹iOS 開發的常用工具,第二部分介紹iOS開發中的一些常見的實踐經驗,第三部分介紹iOS 開發中涉及的原理。
如果把成為iOS 開發高手的過程比作武俠小說中的修煉過程的話,工具、實踐和理論的學習就分別對應兵器、招式和內功的修煉。《iOS開發進階》希望通過這三方面的綜合講解,全面提高開發者的技能水平。
目錄
推薦序. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii
第1 章引言. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1 我為什麼要寫本書1
1.1.1 我的構思1
1.1.2 內容導讀1
1.1.3 目標讀者2
1.1.4 隨書示例代碼和勘誤2
1.1.5 致謝2
1.2 如何提高iOS 開發技能3
1.2.1 閱讀部落格3
1.2.2 讀書3
1.2.3 看WWDC 視頻4
1.2.4 看蘋果的官方文檔4
1.2.5 看開源項目的代碼4
1.2.6 多寫代碼,多思考4
1.2.7 多和同行交流5
1.2.8 分享5
I 第一部分:iOS 開發工具
第2 章使用CocoaPods 做依賴管理. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.1 CocoaPods 簡介9
2.2 CocoaPods 的安裝和使用10
2.2.1 CocoaPods 的安裝10
2.2.2 使用CocoaPods 的鏡像索引10
2.2.3 使用CocoaPods 11
2.2.4 查找第三方庫11
2.3 注意事項12
2.3.1 關於.gitignore 12
2.3.2 為自己的項目創建podspec 檔案12
2.3.3 使用私有的pods 12
2.3.4 不更新podspec 12
2.3.5 生成第三方庫的幫助文檔13
2.3.6 原理13
第3 章網路封包分析工具Charles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.1 Charles 簡介15
3.2 Charles 的安裝和使用16
3.2.1 安裝Charles 16
3.2.2 安裝SSL 證書16
3.2.3 將Charles 設定成系統代理17
3.2.4 Charles 主界面介紹18
3.2.5 過濾網路請求18
3.3 使用Charles 協助iOS 開發19
3.3.1 截取iPhone 上的網路封包19
3.3.2 模擬慢速網路21
3.4 高級功能22
3.4.1 截取SSL 信息22
3.4.2 修改網路請求內容23
3.4.3 修改伺服器返回內容25
3.5 Map 功能25
3.6 Rewrite 功能27
3.7 Breakpoints 功能29
3.8 總結30
3.9 參考連結30
第4 章界面調試工具Reveal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.1 Reveal 簡介31
4.2 Reveal 的使用32
4.2.1 用Reveal 連線模擬器調試32
4.2.2 用Reveal 連線真機調試34
4.2.3 用Reveal 調試其他套用界面34
4.2.4 總結35
4.2.5 參考資料36
第5 章移動統計工具Flurry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.1 Flurry 簡介37
5.2 Flurry 的基本使用38
5.2.1 註冊和下載對應SDK 38
5.2.2 集成SDK 40
5.2.3 自定義統計項42
5.2.4 查看統計結果43
5.2.5 統計Crashlog 44
5.3 對比和總結45
5.3.1 和其他統計分析平台的對比45
5.3.2 總結45
第6 章崩潰日誌記錄工具Crashlytics. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
6.1 Crashlytics 簡介47
6.2 Crashlytics 的使用49
6.3 實現原理和使用體會52
第7 章App Store 統計工具App Annie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
7.1 App Annie 簡介55
7.2 App Annie 的使用56
7.3 App Annie 賬號的註冊及配置59
7.4 和其他工具的對比60
7.4.1 官方的命令行工具60
7.4.2 其他類似服務61
7.4.3 功能對比61
第8 章Xcode 外掛程式. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
8.1 Xcode 外掛程式管理工具Alcatraz 63
8.1.1 簡介63
8.1.2 安裝和刪除64
8.1.3 使用64
8.1.4 外掛程式路徑66
8.2 關於Xcode 的外掛程式機制66
8.3 常用Xcode 外掛程式66
8.3.1 KSImageNamed 66
8.3.2 XVim 67
8.3.3 FuzzyAutocompletePlugin 67
8.3.4 XToDo 67
8.3.5 BBUDebuggerTuckAway 68
8.3.6 SCXcodeSwitchExpander 68
8.3.7 deriveddata-exterminator 68
8.3.8 VVDocumenter 69
8.3.9 ClangFormat 69
8.3.10 ColorSense 69
8.3.11 XcodeBoost 70
第9 章其他工具介紹. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
9.1 取色工具:數碼測色計(DigitalColor Meter) 71
9.1.1 前言71
9.1.2 使用介紹71
9.1.3 其他類似工具:xScope 72
9.2 其他圖形工具73
9.2.1 ImageOptim 73
9.2.2 馬克鰻74
9.2.3 Dash 74
9.2.4 蒲公英75
9.3 命令行工具75
9.3.1 nomad 75
9.3.2 xctool 76
9.3.3 appledoc 76
II 第二部分:iOS 開發實踐
第10 章理解記憶體管理. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
10.1 引用計數81
10.1.1 什麼是引用計數,原理是什麼81
10.1.2 我們為什麼需要引用計數83
10.1.3 不要向已經釋放的對象傳送訊息85
10.1.4 循環引用(reference cycles)問題85
10.1.5 使用Xcode 檢測循環引用88
10.2 使用ARC 90
10.2.1 Automatic Reference Count 90
10.2.2 Core Foundation 對象的記憶體管理92
第11 章掌握GCD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
11.1 GCD 簡介95
11.2 使用GCD 97
11.2.1 block 的定義97
11.2.2 系統提供的dispatch 方法98
11.2.3 修改block 之外的變數99
11.2.4 後台運行99
11.2.5 總結100
第12 章使用UIWindow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
12.1 UIWindow 簡介101
12.2 為UIWindow 增加UIView 102
12.3 系統對UIWindow 的使用102
12.3.1 WindowLevel 104
12.3.2 手工創建UIWindow 105
12.3.3 不要濫用UIWindow 108
12.3.4 參考資料109
第13 章動態下載系統提供的多種中文字型. . . . . . . . . . . . . . . . . . . . . . . . . 111
13.1 功能簡介111
13.1.1 前言111
13.1.2 功能介紹112
13.1.3 字型列表112
13.2 使用教程113
13.2.1 相關API 介紹113
13.2.2 總結115
第14 章使用套用內支付. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
14.1 後台設定117
14.2 iOS 端開發119
14.3 服務端開發121
14.4 注意事項122
第15 章基於UIWebView 的混合編程. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
15.1 混合編程簡介123
15.2 使用模板引擎渲染HTML 界面124
15.3 Objective-C 語言和JavaScript 語言相互調用126
15.4 如何傳遞參數129
15.5 同步和異步129
15.6 注意事項130
15.6.1 執行緒阻塞問題130
15.6.2 主執行緒的問題130
15.6.3 鍵盤控制130
15.6.4 CommonJS 規範130
15.7 使用Safari 進行調試131
第16 章安全性問題. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
16.1 前言135
16.2 網路安全135
16.2.1 安全地傳輸用戶密碼135
16.2.2 防止通訊協定被輕易破解137
16.2.3 驗證套用內支付的憑證138
16.3 本地檔案和數據安全138
16.3.1 程式檔案的安全138
16.3.2 本地數據安全140
16.4 原始碼安全140
16.5 總結142
第17 章基於CoreText 的排版引擎. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
17.1 CoreText 簡介143
17.2 基於CoreText 的基礎排版引擎145
第18 章實戰技巧. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
18.1 App Store 與審核181
18.1.1 撤銷正在審核的套用181
18.1.2 申請加急審核181
18.1.3 套用在市場的名字182
18.1.4 測試設備數的限制182
18.1.5 如何將套用下架183
18.1.6 如何舉報別的套用侵權183
18.1.7 iTunes Connect 後台操作出錯184
18.1.8 Metadata Reject 184
18.2 開發技巧184
18.2.1 UILabel 內容模糊184
18.2.2 收起鍵盤184
18.2.3 NSJSONSerialization 比NSKeyedArchiver 更好185
18.2.4 設定套用內的系統控制項語言185
18.2.5 為什麼viewDidUnload 被廢棄188
18.2.6 多人協作慎用Storyboard 189
18.2.7 避免濫用block 190
18.2.8 合併工程檔案的衝突192
18.2.9 忽略編譯警告193
18.3 Xcode 使用技巧193
18.3.1 Xcode 快捷鍵193
18.3.2 查找技巧195
18.3.3 JavaScript 檔案設定調整195
18.3.4 清除DerivedData 196
18.3.5 target 信息異常197
18.3.6 下載Xcode 197
18.4 調試技巧197
18.4.1 模擬器快捷鍵197
18.4.2 覆蓋安裝注意事項197
18.4.3 給模擬器相冊增加圖片198
18.4.4 獲得模擬器中的程式數據198
18.4.5 安裝舊版本的模擬器199
18.4.6 模擬慢速網路199
18.4.7 異常斷點與符號斷點199
18.5 ipa 檔案格式199
18.5.1 查看ipa 的內容199
18.5.2 查看ipa 中的圖片200
18.6 為工程增加Daily Build 201
18.6.1 前言201
18.6.2 步驟201
18.6.3 遇到的問題206
18.6.4 總結206
18.7 使用腳本提高開發效率206
18.7.1 刪除未使用的圖片資源206
18.7.2 用腳本自動生成小尺寸的圖片207
18.7.3 檢查圖片208
18.8 管理代碼片段209
18.8.1 代碼片段介紹209
18.8.2 定義自己的代碼片段210
18.8.3 使用Git 管理代碼片段211
18.8.4 其他代碼片段管理工具211
III 第三部分:iOS 開發底層原理
第19 章Objective-C 對象模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
19.1 簡介215
19.2 isa 指針215
19.3 類的成員變數217
19.4 對象模型的套用220
19.4.1 動態創建對象220
19.4.2 系統相關API 及套用222
19.4.3 參考文獻226
第20 章Tagged Pointer 對象. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
20.1 原有系統的問題227
20.2 Tagged Pointer 介紹228
20.2.1 Tagged Pointer 228
20.2.2 特點230
20.3 注意事項和實現細節231
20.3.1 isa 指針231
20.3.2 64 位下的isa 指針最佳化231
20.3.3 isa 的bit 位含義232
20.3.4 總結233
20.3.5 參考文獻233
第21 章block 對象模型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
21.1 block 的內部數據結構定義235
21.2 用clang 分析block 實現237
21.2.1 NSConcreteMallocBlock 類型的block 的實現242
21.2.2 變數的複製243
21.3 注意事項243
21.3.1 避免循環引用243
21.3.2 ARC 對block 類型的影響244
作者簡介
唐巧,Blogger、InfoQ編輯,資深iOS開發者。曾在網易參與過網易信箱、網易微博、有道雲筆記的開發。目前正參與網際網路教育公司猿題庫的創業,負責猿題庫和小猿搜題的iOS版本開發。
媒體評論
從2008年蘋果發布第一代iOSSDK至今,已經有六個年頭,整個移動開發的熱潮也持續五六年了,但iOS開發者仍舊非常短缺,特別是優秀的iOS開發者。我一直在說,每一個行業裡面的開發者,都應該有所追求,要變成行業的佼佼者,這不僅是因為我們都想有更高的收入,而且是人本身就該有追求。唐巧就是我們這個行業中非常優秀的開發者,但是更值得稱讚的是,他提供了這么一本書,讓我們也有機會變成更專業的、更優秀的開發者,善莫大焉。
——OurCoders站長,資深iOS開發者tinyfool
作為一本面向中高級iOS開發者的書籍,《iOS開發進階》一書匯總了很多進階開發時所常用和必備的知識。閱讀本書不但能幫你藉助各類工具大幅提升開發效率,也能讓你加深對iOS及Objective-C背後機制的理解。如果你想在iOS開發的道路上百尺竿頭更進一步的話,這本凝聚了作者多年開發實戰經驗的進階圖書將是你不可錯過的夥伴!
——objccn.io創始人、《Swifter》作者王巍(onevcat)
唐巧是國內較早從事iOS開發的資深工程師,並在個人部落格、InfoQ、微信公眾號等平台持續更新技術文章,我們也曾邀請他給微信iOS團隊分享相關經驗。目前市面上缺乏對Objective-C高級特性、Xcode外掛程式等做全面剖析和整理的圖書,《iOS開發進階》很好地填充了此處的空白,相信對廣大iOS開發者會有很大的幫助。
——微信iOS客戶端團隊負責人lylechen
本人有幸曾和作者唐巧共事,當時他還負責微博後台研發。四年後唐巧轉做iOS開發,並成為國內資深專家。作者的工作經曆本身就是一次完美的“iOS開發進階”。如果你剛剛提交了第一款AppStore套用,那本書第一部分一定會有很多高效的工具可以幫你;如果你已有一兩年iOS開發經驗,那你一定會對第二部分的各種實戰技巧相見恨晚;本書最後部分的底層原理是你成為資深工程師的必備課程。
——網易新聞客戶端技術負責人王聰(robaggio)
前言
人生如長跑,成長如進階
曾經有很多次想提筆寫一本純粹的技術圖書,有幾次甚至已經把目錄做完了,但是看到“層巒疊嶂”的目錄結構,我總是心生恐懼。一想到要耗費一年多的業餘時間去寫那些枯燥無味的技術文字,並逐一核對各種技術細節,我仿佛置身幽暗的森林而無法自拔。計畫還未開始,就已經結束了。
總有人會去做這些費時費力並能夠惠及大眾的事情,他們像一個個沉默的跑者,在奔跑的同時,不停地標出路線,記錄經驗,傳播技巧,並吸引更多的人加入跑步的隊伍一起成長。
唐巧就是其中之一。
我很早就認識了唐巧,那時他還是一個初入江湖的“小球”,高高瘦瘦,正在網易有道做雲筆記的開發。短短几年之內,唐巧獲得了飛速的成長,他不僅是一個優秀的iOS 開發者,而且成為iOS 領域的布道者。他從2011 年開始構建獨立部落格“唐巧的技術部落格”,撰寫了大量的iOS 開發相關的文章,成為知名iOS 博主。2012 年唐巧離開網易有道,加入猿題庫,成為一個創業者。期間他組建了由iOS 開發領域頂尖開發者構成的“真·iOS 開發”QQ 群,大家一邊在群里討論技術問題,一邊通過各自的部落格把成果分享出去。我有幸參與其中,可以說,這是iOS 領域最專業的技術群體之一。2013 年春節,唐巧開通了微信公眾平台“iOS 開發”(iOSDevTips),開始基於微信公眾號傳播自己的開發理念和相關技術,迄今為止已經積累了一萬多名專業訂閱者。
在承擔日常研發任務的同時,還能做這么多的技術寫作和內容分享,他讓我這個老程式設計師亦十分佩服。
2013 年的一天,我在一次技術會議上碰到了唐巧,談起了技術寫作的事情。現在國內iOS 開發領域的技術圖書良莠不齊,很多是“編著”,摘抄或翻譯自官方文檔,而且大家很喜歡去寫入門類的圖書,從程式語言、MVC、協定、策略到Xcode 的使用,到第一個App 項目的構建,等等,高級一點的進階內容就少有涉及,很多iOS 開發者讓我推薦一本面向中高級開發者的中文書時,我總是遍尋不著。那時候我正準備出版自己的《MacTalk·人生元編程》,於是也希望唐巧寫一本iOS 進階方面的書。我對唐巧說,你的部落格上已經產出了那么多高質量的iOS 開發進階內容,為什麼不再增加一些內容,集結成冊梳理成書呢?他若有所思地回答,我正準備這么乾!
經年以後,唐巧再也沒和我提起這件事,我也在忙忙碌碌中把他的書忘得一乾二淨。上周突然收到唐巧的一份書稿,打開一看,《iOS 開發進階》靜靜地躺在信箱里,已然成書。唐巧用了一年的時間,在部落格文章的基礎上進行完善、修改、增補,用清晰的“絲線”把散落各處的“珍珠”串起,形成脈絡完整的知識體系,然後又新增了超過成書一半的內容,最終完成了這本關於iOS 開發的進階圖書。
書中從iOS 開發實戰最常用的工具講起,一直寫到底層開發原理。內容分成三塊:工具、實踐和原理,每個章節都獨立成文,讀者可以從頭細細品讀,也可以隨時翻閱其中一節,利用碎片時間閱讀學習。就我個人而言,非常喜歡實踐和原理兩個部分,比如處理多核編程的GCD 技術、應用程式安全技術、CoreText 的排版引擎、Objective-C 對象模型、block 對象模型等,這些內容要么能幫助我解決實際問題,要么能夠答疑解惑,深入細節。作為一個仍然在一線開發的技術作者,唐巧採用了圖文並茂的方式去闡述問題,每個技術專題都配備了恰當的代碼,力求將複雜的技術以最為簡潔的方式呈現出來,讓讀者一目了然,讀來深入淺出,並不枯燥。
寫書永遠有遺憾。由於出版時間的要求,這本書的原理部分略顯單薄,另外,全書並未涉及蘋果的最新語言Swift 相關的內容,相關的代碼示例都是基於Objective-C 的。希望唐巧的下一本書能夠涉及更多這部分內容,這也是我的一個心愿。
在這樣一個原創匱乏的年代,我能做到的就是向更多的人去推薦這樣一本書。人生如長跑,成長如進階,如果你是一個iOS 開發者,這本書一定不要錯過!
池建強
《MacTalk·人生元編程》作者
微信平台MacTalk 出品人
2014 年,冬