整理自:IOS 總體框架類圖值得收藏html
在iOS開發過程當中,對iOS總體框架的瞭解和學習是必不可少的一個環節,今天咱們就好好來了解一下iOS的總體框架。首先貼一個關於iOS的框架介紹:iOS系統框架概述。咱們一般稱呼iOS的框架爲Cocoa Touch框架,Cocoa Touch是一個框架的集合,裏面包含了衆多的子框架。每個子框架都是一個目錄,包含了共享資源庫,用於訪問該資源庫中儲存的代碼的頭文件,以及圖像、聲音文件等其餘資源,共享資源庫定義應用程序能夠調用的函數和方法。框架中的類相互依賴構成一個總體,提供完善的某一方面的服務或解決方案,多個框架一塊兒實現整個應用程序的結構。因爲應用程序的結構是通用的,開發者經過框架提供的函數和方法,作細緻個性化的處理,從而知足不一樣應用的不一樣需求。開發一個應用程序就是將需求細緻化的代碼插入到框架提供的設計中來組合成一個總體完成最終的應用設計。安全
iOS的總體系統框架圖以下圖所示,iOS的系統架構主要由Application Layer(應用層)、Cocoa Touch Layer(觸摸層)、Media Layer (媒體層)、Core Services Layer(核心服務層)、Core OS Layer (核心系統操做層)和The Kernel and Device Drivers layer(內核和驅動層)。服務器
瞭解了系統架構,那麼每一層的主要功能是什麼呢?下圖就是iOS8.3系統的框架架構圖,最新的圖沒有找到,如今iOS11中新增了一些功能模塊,可是總體的框架大同小異。
網絡
上面的每一模塊只是簡單滴介紹了大體功能,更多詳細信息你們能夠 戳這裏看大神的博客瞭解更多:iOS整體框架介紹和詳盡說明。顯然,在上面全部的框架中,最重要也最常用的就是UIKit和Foundation框架,在本文的第二部分咱們將詳細介紹這兩部分中的類繼承體系。數據結構
官方文檔戳這裏!!,解釋一下,官方文檔中將OS體系分爲四層,以下圖所示,沒有Cocoa Touch Layer和Application Layer,取而代之的是Cocoa (Application) Layer。咱們再細看官網的對Cocoa (Application) Layer的官方解釋以下,說的是該層是爲建立App提供了用戶界面基礎,響應用戶事件,而且能夠管理App的行爲。這其實就是Cocoa Touch Layer(觸摸層,UIKit)的做用,只是官網省略了Application Layer(應用層),由於這一層主要就是app了,主要由開發人員完成。其餘的資料你們自行根據官方文檔查看,在這裏就不過多進行解讀和分析了。多線程
The Cocoa (Application) layer includes technologies for building an app’s user interface, for responding to user events, and for managing app behavior.架構
Cocoa框架是iOS應用程序的基礎,是OS X和 iOS操做系統的程序的運行環境,瞭解Cocoa框架,對開發iOS應用有很大的幫助。iOS中,Cocoa衆多框架中最重要最基本的兩個框架是:Foundation 和 UIKit。這兩個框架基本包含了iOS、OS X開發過程當中要用到的絕大多數OC類,所以這兩個框架是Cocoa框架其中Foundation 和界面無關,也能夠說和界面無關的類基本是Foundation框架的,和界面相關的是UIKit框架。這兩個框架在系統中處於的位置如圖:app
以前在學習Java和Android時,Java和Android提供了很是詳盡的系統框架,並在API的索引中中對Java和Android的類繼承體系和分類都很是明晰,而在iOS開發過程當中,API中類的聚合是按照功能和做用劃分模塊,對iOS中的類繼承體系沒有一個明確的介紹。而類繼承體系的瞭解有助於咱們對iOS系統的整個模塊的體系框架有一個更爲清晰的瞭解和認識,對對應類繼承體系中的類的特性和常規用法都有一個大體的認識和了解。所以,這兩天得閒就對這一塊進行整理和學習,對Cocoa框架中的最重要的Foundation 和 UIKit框架中的類繼承體系進行了梳理。框架
Foundation框架爲全部應用程序提供基本的系統服務。應用程序以及 UIKit和其餘框架,都是創建在 Foundation 框架的基礎結構之上。 Foundation框架提供許多基本的對象類和數據類型,使其成爲應用程序開發的基礎。它還制定了一些約定(如用於取消分配等任務),使代碼更加一致,可複用性更好。 異步
話很少說,咱們先來看看Foundation框架,三個圖,包括了Foundation因此的類,圖中灰色的是iOS不支持的,灰色部分是OS X系統的。
將上圖Foundation框架中的類進行邏輯分類以下:
對於Foundation框架中的一些基本類的使用方法詳情參見:iOS開發系列—Objective-C之Foundation框架
一樣的, UIKitk框架的類繼承體系圖以下圖所示:
在圖中能夠看出,responder 類是圖中最大分支的根類,UIResponder爲處理響應事件和響應鏈 定義了界面和默認行爲。當用戶用手指滾動列表或者在虛擬鍵盤上輸入時,UIKit就生成時間傳送給UIResponder響應鏈,直到鏈中有對象處理這個 事件。相應的核心對象,好比:UIApplication ,UIWindow,UIView都直接或間接的從UIResponder繼承 。UIKit框架的各個類的簡單介紹戳後面的連接:UIKit框架各個類的簡要說明
此處內容所有來源於: IOS 總體框架類圖值得收藏
Objective-C和Java C++同樣,有封裝,繼承,多態,重用。可是它不像C++那樣有重載操做法、模版和多繼承,也沒有Java的垃圾回收機制。
Objective-C語言有C++ Java等面向對象的特色,那是遠遠不能體現它的優勢的。Objective-C的優勢是它是動態的。動態能力有三種:
每一個Objective-C對象都有一個隱藏的數據結構,這個數據結構是Objective-C對象的第一個成員變量,它就是isa指針。這個指針指向哪 呢?它指向一個類對象(class object 記住它是個對象,是佔用內存空間的一個變量,這個對象在編譯的時候編譯器就生成了,專門來描述某個類的定義),這個類對象包含了Objective-C 對象的一些信息(爲了區分兩個對象,我把前面提到的對象叫Objective-C對象),包括Objective-C對象的方法調度表,實現了什麼協議等 等。這個包含信息就是Objective-C動態能力的根源了。那咱們看看isa指針類型的數據結構是什麼樣的?
若是拋開NSObject對象的其餘的成員數據和變量,NSObject能夠當作這樣:
@interface NSObject <NSObject> { Class isa; }
不考慮@interface關鍵字在編譯時的做用,能夠把NSObject更接近C語言結構表示爲:
struct NSObject{ Class isa; }
Class是用typedef 定義的: typedef struct objc_class *Class; ,那NSObject能夠這麼寫了
struct NSObject{ objc_class *isa }
那objc_class的結構是什麼樣的呢?大概是這樣的:
struct objc_class { Class isa; Class super_class; const char *name; long version; long info; long instance_size; struct objc_ivar_list *ivars; struct objc_method_list **methodLists; struct objc_cache *cache; struct objc_protocol_list *protocols; }
這裏會看到, 在這個結構體裏還有一個isa指針,又是一重指向,是否是有種到了盜夢空間的感受。不用緊張,take easy,不會有那麼多層次的,這裏的isa指針指向的是元類對象(metaclass object),帶有元字,證實快到頭了。那元對象有啥用呢?它用來存儲的關於類的版本,名字,類方法等信息。全部的元類對象(metaclass object)都指向 NSObject的元類對象,到頭仍是NSObject。一共三次:類對象->元類對象->NSObject元類對象。
爲了獲得整個類組織架構的信息,objc_class結構裏定義了第二個成員變量Class super_class,它指向父類的類對象。說了這麼多,可能關係縷不清楚,有道是一張圖賽過千言萬語
從上圖中能夠看出,D3繼承D2,D2繼承D1,D1最終繼承NSObject。那麼下圖是從D3的一個對象開始,排列出D3 D2 D1 NSObject 類對象,元類對象等的關係,圖中的箭頭都是指針的指向。
NSObject是大部分Objective-C類的根類,它沒有父類。其它類繼承NSObject,訪問Objective-C運行時系統的基本接口,這樣其餘類的實例能夠得到運行時的能力。