1 概述
? ? ? ? iOS開發基礎技術大致分為以下四個方面:
1)UIKit & Other UI-Related Techniques
?? ? ??主要指的iOS程序基礎架構及用戶界面元素(控件及頁面繪制、動畫等)。
2)Networking
? ? ? ?iOS中常用的Networking技術主要包括HTTP(s)及TCP,前者主要的API封裝在URL Loading System中,后者API主要封裝在CFNetwork的Stream(ReadStream&WriteStream)中。
3)Concurrency & Threading
? ? ? ?iOS中常用的多線程技術主要包括Operation&OperationQueue, GCD, Threading(NSThread)還有pthread。
4)Software Engineering & Program Design Techniques
? ? ? ? 以上幾方面為構建一個iOS程序的building blocks,除此之外,還有一方面知識及技術,它不屬于以上任何一個課題,而是貫穿、滲透其中,這便是軟件設計思想;軟件工程方法及軟件設計思想解決的是軟件生命周期中的“可持續發展”問題,包括易擴展、可復用等;脫離設計思想進行開發的代碼難于維護,易于出錯。這部分內容比較廣,相關的讀物也比較多,蘋果本身也有對其系統及API的設計理念進行相關的說明(詳見:Cocoa Fundamentals Guide,該文檔已標記為Retired,但其中的內容仍值得細讀)。最基本地,應了解OOD(Object-Oriented Design)中的SOLID原則(FYI: SOLID介紹,鏈接指向wikipedia.org)及圍繞此五大原則展開的相關常用設計模式。
備注:本文提及蘋果官方文檔主要分為兩類:
1)Programming Guide(以下簡稱PG):主要介紹某個類或者某套API的設計思想及用法,主要用途是對類及API作導引性的介紹;
2)API Reference(以下簡稱Ref):詳盡說明某套API或某個類包含的接口,包括入參、返回值等,主要用途是作為使用手冊查閱。
2?UIKit & Other UI-Related Techniques
? ? ? ?UIKit Framework定義、實現了程序及其生命周期、程序運行環境及各種界面、控件元素等API,供我們調用。
2.1 程序生命周期
程序生命周期定義了與程序啟動、退出等生命周期相關的關鍵事件,我們利用這套API可以對程序在其生命周期的關鍵點的行為進行攔截及干預,比如:
1)為程序添加Push Notification;
2)利用預定義的協議進行App間的通信(通過DeepLink等跨程序手段);
3)其它相關服務,比如Bugly等用戶行為數據收集SDK啟動等。
2.2 程序運行環境
程序運行的環境主要包括:
1)數據、資源的配置及管理的入口,比如在Xcode中利用plist及ImageAssets等管理語言包、圖標等素材;
2)相關環境信息的API,比如屏幕及設備的尺寸、系統版本等提取API(UIScreen&UIDevice等);
3)其它配置等。
2.3 界面、控件等
UIKit的大部分API都是和界面、控件相關的:
1)UIViewControllers及其子類用戶管理程序界面層級及界面與數據的交互“中轉站”
? ? ? ?iOS中的ViewController分為兩種:
· Container View Controller:
? ? ? ?UIKit預定義了幾種container view controller,比如UITabBarController、UINavigationController等
·?Content View Controller
? ? ? ?為方便使用,UIKit把幾種常用的View集成到Controller中,預定義了幾種Content View Controller,如UITableViewController,UICollectionViewController等。
關于ViewController的定義及作用可參閱View Controller Programming Guide for iOS;關于具體container view controller&content view controller的用法用相關API需參閱其對應的Ref文檔。
2)UIView及其各類子類(控件及非控件子類)用于構建程序的用戶界面及處理用戶交互相關事件(如點擊、拖動等)
? ? ? ? iOS中使用頻率較高的幾種View有UIView,UIButton,UIImageView,UILabel,UITextField(UITextView),UIScrollView,UITableView, UICollectionView等,開發過程中可選用何種View的主要根據是樣式及交互方式(比點擊、拖動等)。
? ? ? ? 關于UIView的特性(如繪制流程、其在iOS App中的角色)可參閱View Programming Guide for iOS(此文檔中的知識較老舊,看得出來蘋果已多年未對此文檔中的內容進行更新及維護了)。對于ScrollView,TableView及ScrollView等UIView的特定子類,蘋果專門為其編寫了具體的指引文檔,另外蘋果對圖片、文本等的處理都有相關文檔可參閱。
3)其它UI相關擴展
? ? ? ?1)及2)中敘述的屬于UIKit中預定義的、相對簡單及基礎的內容,其中的API只能滿足相對尋常的場景,對于特殊場景(比如復雜交互手勢處理、特大規模圖、文界面繪制及處理),需要對UIKit中的類和對象進行比較深度的“客制化”,為此蘋果在提供了相關的基礎功能之外,也提供了擴展的入口及可能性。
2.4 動畫及其它
1)動畫是iOS 程序中不可或缺的元素。動畫的本質可以理解為某個(些)屬性在某段時間間隔內以某種時間曲線從一個值變化到另一個值的過程。由此,動畫包含以下要素:屬性、時長、曲線、初始值及末位值。這些要素組合可以產生更復雜的動畫,如時長分為幾個時間段(每段可配以獨立的曲線)可以生成幀動畫、多個屬性一起變動可以生成組動畫、組動畫可以配合幀動畫一起使用等。從API來說,蘋果由簡單到復雜提供了基于UIView的動畫API、Core Animation等,在此基礎上蘋果還提供了基于物理引擎的UIDynamics,如果使用以上API仍滿足不了需求,還可借助第三方(可能需要付費)編寫集成更復雜的骨骼動畫等(骨骼動畫在App研發中使用較少,游戲中使用較多)。
? ? ? ? Core Animation文檔:Core Animation Programming Guide
2)Core Animation除了動畫相關的API外,還涉及界面的繪制、渲染等,與此相關的話題可延伸至:
? ? ? · Image I/O(圖片相關的內存管理、編碼解碼等API):Image I/O Programming Guide;
? ? ? · Core Graphics(Quartz 2D):Quzrtz 2D Programming Guide;
? ? ? · Core Image(CI框架主要涉及人臉識別及濾鏡處理):Core Image Programming Guide;
? ? ? · Core Text框架進行復雜圖文繪制及管理(如雜志App等):Core Text Programming Guide。
? ? ? ? Core Text是一套偏底層、復雜的API,一般的文本繪制及處理用普通的Label,TextField, TextView配合Text Container&Text Storage即可實現,需要進行較復雜的圖文混合排版時則需要使用Core Text。
? ? ? ? 關于界面及圖文的渲染、繪制流程是一個從寬度和廣度來說都比較大的話題,除以上iOS提供的基礎技術及框架外,還可延伸至OpenGL ES,蘋果亦提供了相關的PG供參考,不過OpenGL ES普通App使用較少。圖片相關的操作主要通過UIImage類進行,其背后涉及CGImage及CIImage等附屬擴展類,各有不同的使用場景,具體參閱上述PG;圖片的編解碼操作容易引起性能問題,這部分問題多為CPU承載了過多的編解碼操作引起的,優化的方向即把此部分工作由CPU過渡至GPU(因為GPU是圖象處理硬件,而CPU是通用硬件),編碼及優化過程中盡可能使用GPU相關的API進行操作(如離屏渲染的觸發及避免場景)。
On SDWebImage,YYImage, GPUImage and Other Image Processing Frameworks
? ? ? ? 目前業內有不少流行的圖片(及/或視頻)處理的開源框架,實際項目為了穩定性及避免重復勞動,可以集成。當然,這些框架各自存在各自的問題,比如SDWebImage,由于其編解碼過程中對內存的使用相對簡單粗暴,所以在處理大圖片的時候存在一些內存暴漲的問題。
3 Networking
? ? ? ?了解計算機網絡相關的概念及設計理念,有助于更好的理解網絡編程相關的API;為此,蘋果提供了文檔(詳見:Networking Concepts),對計算機網絡進行了簡單地“科普”。這份文檔介紹的內容與大學“計算機網絡”課程大致相當,但相對簡要及接地氣(貼近實際應用)。
? ? ? ?iOS App研發過程中使用頻率比較高的是HTTP(s)及TCP長鏈接(一般通過socket實現)。
3.1 HTTP(s)
? ? ? ? 在基于OC的Foundation層,HTTP(s)相關的網絡編程API,蘋果官方統稱為URL Loading System(以下簡稱ULS)。這套API除了介紹常規的HTTP(s)交互(GET,POST, PUT,HEAD等)還介紹了自定義協議相關的技術(比如攔截請求用以Mock數據)、對HTTP(s)流程進行必要的干預(比如防止Charles等抓包進行抓包)等。
? ? ? ? ULS提供的API雖然涵蓋了常規的HTTP(s)用法,使用相對簡單及直白,但對請求及返回所提供的控制比較有限(比如DNS解析、鏈接的建立及關閉等全部由ULS內部進行了封裝,未向開發者暴露相關接口)。若想對請求及返回的過程進行比較精密的控制則需要下潛至Core Foundation層,使用CFNetwork相關API。
? ? ? ? On AFNetworking & ASIHTTPRequest
? ? ? ? 關于網絡套件,目前業內存在不少成熟、穩定的解決方案,比如早年的基于CFNetwork的ASIHTTPRequest(2013年之前后基本被業界廢棄)及目前主流的基于URLSession的AFNetworking,除此之外國內還流行類似YTK等對AFN進行二次封裝的網絡套件,但這些套件大多過于龐大、臃腫;并且在URLSession發布之后(iOS7.0及更新),AFNetworking的存在似乎沒有以前URLConnection時代意義大----因為URLSession這套API的設計吸取了“AFNetworking基于block的回調”的思想,使用URLSession也可以寫出緊湊的代碼。
3.2 TCP & CFNetwork
在iOS研發中,TCP長鏈接在編碼上有兩種實現方式:
1)在基于OC的Foundation層,可使用NSStream(創建過程仍需調用Core Foundation層的API);
2)使用基于C語言的Core Foundation層的CFNetwork(以下簡稱CFN)相關API。
? ? ? ?事實上,TCP Socket API只是CFN中非常小的一個子集,除此之外,CFN還提供了HTTP、FTP等API。相比基于OC的Foundation層提供的URL Loading System,CFN為HTTP提供了更多的控制入口(比如DNS解析等),當然提供的接口豐富也就意味著在易用性上不如ULS;具體參閱CFNetwork Programming Guide。
3.3 擴展研究及閱讀
? ? ? ?以上兩方面僅從蘋果提供的API角度簡單介紹了HTTP(s)及TCP長鏈接相關的技術,更底層的話題超出蘋果官方文檔涵蓋的范圍,比如:
1)HTTP(s)協議的設計及演進(雖然現行的HTTP多為1.x及2.0,但目前基于UDP的HTTP 3.0已經萌芽);
2)TCP/IP設計及實現(比如TCP詳解一書對此進行了詳盡的說明);
3)關于Socket,還可以了解posix socket相關的API,等等。
4 Concurrency&Threading
iOS中的多線程技術從高級到底層依次有Operation/OperationQueue,GCD,NSThread和pthread。
1)Operation/OperationQueue基于GCD進行封裝,更“面向對象”,適用于定義比較清晰的任務;它提供了任務狀態的管理,包括就緒、開始、完成、取消等,還提供了任務間的依賴關系;
2)GCD比Operation/OperationQueue輕量級,使用起來更方便;它屏蔽了傳統線程管理中的鎖等同步手段,把程序員從“線程”的概念中解放出來,專注于“任務”(即block);然而,這并不意味著使用gcd不會引起死鎖問題,使用過程中仍需謹慎;
? ? ? ?以上兩套API為常規研發中多線程編程的首選,從復雜度來說因為它們屏蔽了傳統線程管理中復雜的、底層的同步機制(如lock、condition等),對比直接操作線程更方便更易用;當然,在實際使用中有某些場景確實需要直接操作線程(比如需要精準控制延時),則需使用以下技術:
3)NSThread是Foundation層基于OC的多線程API,比較常規的用法應該是NSThread配合NSRunLoop啟動常駐線程;
4)pthread是超越iOS的通用API,比如寫一些跨平臺模塊的時候可以使用;另外由于上述三套API所創建的線程都是detached的,而pthread創建的線程默認狀態是joinable的,所以在iOS研發中pthread經常被用來創建專用于保存數據的線程。
關于GCD和Operation/OperationQueue,可參閱文檔Concurrency Programming Guide
關于NSThread及pthread,可參閱:?Threading Programming Guide,該文檔中的pthread部分只作了簡單介紹,更詳細信息需,可參閱:pthread使用手冊
5 On Algorithm&Data Structure and Other CS Topics
? ? ? ? 算法與數據結構是基礎知識,它的意義在于思維模式;掌握算法與數據結構有助于寫出更優雅、高效的代碼,比如在業務代碼中使用更合理的結構的代碼解決問題;我們經常可以看到代碼中嵌套了很多非必須的循環,并且是多重嵌套;學好算法與數據結構有助于避免這種情況。
? ? ? ? ?iOS開發與其它開發工作一樣,是一個系統工程,僅掌握iOS平臺的技術是不夠的;計算機網絡、操作系統等話題雖然偏理論,掌握這些理論有助于更全面、透徹地理解編程這項工作。
成文倉促,必然有許多錯漏。