1. 程式人生 > 其它 >iOS學習——iOS 整體框架及類繼承框架圖

iOS學習——iOS 整體框架及類繼承框架圖

  整理自:IOS 整體框架類圖值得收藏

 一 整體框架

在iOS開發過程中,對iOS整體框架的瞭解和學習是必不可少的一個環節,今天我們就好好來了解一下iOS的整體框架。首先貼一個關於iOS的框架介紹:iOS系統框架概述。我們通常稱呼iOS的框架為Cocoa Touch框架,Cocoa Touch是一個框架的集合,裡面包含了眾多的子框架。每一個子框架都是一個目錄,包含了共享資源庫,用於訪問該資源庫中儲存的程式碼的標頭檔案,以及影象、聲音檔案等其他資源,共享資源庫定義應用程式可以呼叫的函式和方法。框架中的類相互依賴構成一個整體,提供完善的某一方面的服務或解決方案,多個框架一起實現整個應用程式的結構。由於應用程式的結構是通用的,開發者通過框架提供的函式和方法,做細緻個性化的處理,從而滿足不同應用的不同需求。開發一個應用程式就是將需求細緻化的程式碼插入到框架提供的設計中來組合成一個整體完成最終的應用設計。

1.1 iOS系統架構

  iOS的整體系統框架圖如下圖所示,iOS的系統架構主要由Application Layer(應用層)、Cocoa Touch Layer(觸控層)、Media Layer (媒體層)、Core Services Layer(核心服務層)、Core OS Layer (核心系統操作層)和The Kernel and Device Drivers layer(核心和驅動層)。

  瞭解了系統架構,那麼每一層的主要功能是什麼呢?下圖就是iOS8.3系統的框架架構圖,最新的圖沒有找到,現在iOS11中新增了一些功能模組,但是整體的框架大同小異。

  • Cocoa Touch Layer
    :觸控層提供應用基礎的關鍵技術支援和應用的外觀。如NotificationCenter的本地通知和遠端推送服務,iAd廣告框架,GameKit遊戲工具框架,訊息UI框架,圖片UI框架,地圖框架,連線手錶框架,UIKit框架、自動適配等等
  • Media Layer:媒體層提供應用中視聽方面的技術,如圖形影象相關的CoreGraphics,CoreImage,GLKit,OpenGL ES,CoreText,ImageIO等等。聲音技術相關的CoreAudio,OpenAL,AVFoundation,視訊相關的CoreMedia,Media Player框架,音視訊傳輸的AirPlay框架等等
  • Core Services Layer:系統服務層提供給應用所需要的基礎的系統服務。如Accounts賬戶框架,廣告框架,資料儲存框架,網路連線框架,地理位置框架,運動框架等等。這些服務中的最核心的是CoreFoundation和Foundation框架,定義了所有應用使用的資料型別。CoreFoundation是基於C的一組介面,Foundation是對CoreFoundation的OC封裝
  • Core OS Layer:系統核心層包含大多數低級別接近硬體的功能,它所包含的框架常常被其它框架所使用。Accelerate框架包含數字訊號,線性代數,影象處理的介面。針對所有的iOS裝置硬體之間的差異做優化,保證寫一次程式碼在所有iOS裝置上高效執行。CoreBluetooth框架利用藍芽和外設互動,包括掃描連線藍芽裝置,儲存連線狀態,斷開連線,獲取外設的資料或者給外設傳輸資料等等。Security框架提供管理證書,公鑰和私鑰信任策略,keychain,hash認證數字簽名等等與安全相關的解決方案。

  上面的每一模組只是簡單滴介紹了大致功能,更多詳細資訊大家可以 戳這裡看大神的部落格瞭解更多:iOS總體框架介紹和詳盡說明。顯然,在上面所有的框架中,最重要也最經常使用的就是UIKitFoundation框架,在本文的第二部分我們將詳細介紹這兩部分中的類繼承體系。

1.2 官方文件

官方文件戳這裡!!解釋一下,官方文件中將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框架的類繼承體系

  Cocoa框架是iOS應用程式的基礎,是OS X和 iOS作業系統的程式的執行環境,瞭解Cocoa框架,對開發iOS應用有很大的幫助。iOS中,Cocoa眾多框架中最重要最基本的兩個框架是:Foundation 和 UIKit。這兩個框架基本包含了iOS、OS X開發過程中要用到的絕大多數OC類,因此這兩個框架是Cocoa框架其中Foundation 和介面無關,也可以說和介面無關的類基本是Foundation框架的,和介面相關的是UIKit框架。這兩個框架在系統中處於的位置如圖:

之前在學習Java和Android時,Java和Android提供了非常詳盡的系統框架,並在API的索引中中對Java和Android的類繼承體系和分類都非常明晰,而在iOS開發過程中,API中類的聚合是按照功能和作用劃分模組,對iOS中的類繼承體系沒有一個明確的介紹。而類繼承體系的瞭解有助於我們對iOS系統的整個模組的體系框架有一個更為清晰的瞭解和認識,對對應類繼承體系中的類的特性和常規用法都有一個大致的認識和了解。因此,這兩天得閒就對這一塊進行整理和學習,對Cocoa框架中的最重要的Foundation 和 UIKit框架中的類繼承體系進行了梳理。

2.1 Foundation框架類繼承體系

  Foundation框架為所有應用程式提供基本的系統服務。應用程式以及 UIKit和其他框架,都是建立在 Foundation 框架的基礎結構之上。 Foundation框架提供許多基本的物件類和資料型別,使其成為應用程式開發的基礎。它還制定了一些約定(如用於取消分配等任務),使程式碼更加一致,可複用性更好。  

  話不多說,我們先來看看Foundation框架,三個圖,包括了Foundation所以的類,圖中灰色的是iOS不支援的,灰色部分是OS X系統的。 

將上圖Foundation框架中的類進行邏輯分類如下:

  1. 值物件
  2. 集合 
  3. 作業系統服務 包括下面三個
    • 檔案系統和URL
    • 程序間通訊。 這個範疇中的大部分類代表不同的系統埠、套接字、和名字伺服器,對實現底層的IPC很有用。NSPipe代表一個BSD管道,即一種程序間的單向通訊通道。  
    • 執行緒和子任務。 NSThread類使您可以建立多執行緒的程式,而各種鎖(lock)類則為彼此競爭的執行緒在訪問程序資源時提供各種控制機制。通過NSTask,您的程式可以分出一個子程序來執行其它工作或進行進度監控。
  4. 通知
  5. 歸檔和序列化
  6. 表示式和條件判斷
  7. Objective-C語言服務

對於Foundation框架中的一些基本類的使用方法詳情參見:iOS開發系列—Objective-C之Foundation框架

 2.2 UIKit框架類繼承體系

  UIKitk框架提供一系列的Class(類)來建立和管理iOS應用程式的使用者介面( UI )介面、應用程式物件、事件控制、繪圖模型、視窗、檢視和用於控制觸控式螢幕等的介面。框架的入口: #import <UIKit/UIKit.h>   ,當引入此標頭檔案後,便可以在程式裡使用任何在UIKit裡宣告的類。(PS: 當然還要把這個框架連結到你的應用程式中)。

  • (PS1: 可以認為是操縱介面的一個API庫)
  • (PS2: UIKit框架是用在iOS平臺上與之對應的是MAC OS X上的Application Kit,二者是姐妹框架,作用和目的沒啥太大區別(我沒有說實現目的的過程也一樣),表混淆了)  

  應用程式可以通過三種方式使用UIKit建立介面:

  1.   在使用者介面工具(interface Buidler)從物件庫裡 拖拽視窗,檢視或者其他的物件使用。
  2.   用程式碼建立
  3.   通過繼承UIView類或間接繼承UIView類實現自定義使用者介面

同樣的, UIKitk框架的類繼承體系圖如下圖所示:

  在圖中可以看出,responder 類是圖中最大分支的根類,UIResponder為處理響應事件和響應鏈 定義了介面和預設行為。當用戶用手指滾動列表或者在虛擬鍵盤上輸入時,UIKit就生成時間傳送給UIResponder響應鏈,直到鏈中有物件處理這個 事件。相應的核心物件,比如:UIApplication  ,UIWindow,UIView都直接或間接的從UIResponder繼承 。UIKit框架的各個類的簡單介紹戳後面的連結:UIKit框架各個類的簡要說明

 三 Cocoa物件

  此處內容全部來源於: IOS 整體框架類圖值得收藏

3.1 Objective-C是面向物件的語言 

  Objective-C和Java C++一樣,有封裝,繼承,多型,重用。但是它不像C++那樣有過載操作法、模版和多繼承,也沒有Java的垃圾回收機制。

3.2 Objective-C的優點

  Objective-C語言有C++ Java等面向物件的特點,那是遠遠不能體現它的優點的。Objective-C的優點是它是動態的。動態能力有三種:

  • 動態類——執行時確定類的物件
  • 動態繫結——執行時確定要呼叫的方法
  • 動態載入——執行時為程式載入新的模組

3.3 動態能力相關的isa指標

  每個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 類物件,元類物件等的關係,圖中的箭頭都是指標的指向。

3.4 根類 NSObject

  NSObject是大部分Objective-C類的根類,它沒有父類。其它類繼承NSObject,訪問Objective-C執行時系統的基本介面,這樣其他類的例項可以獲得執行時的能力。

  • 根類和根類協議:NSObject不但是個類名,NSObject也是個協議的名稱,參考NSObject協議 , NSObject協議指定了根類必須實現的介面。
  • 根類的主要方法:分配、初始化、複製
    • 分配:alloc和allocWithZone:方法用於從某記憶體區域中分配一個物件記憶體,並使物件指向其執行時的類定義。
    • 初始化:init方法是物件初始化。
    • new是一個將簡單的記憶體分配和初始化結合起來的方法。
    • 複製:copy和copyWithZone
  • 物件的保持和清理:
    • retain方法增加物件的保持次數。
    • release方法減少物件的保持次數。
    • autorelease方法也是減少物件的保持次數,但是以推遲的方式。
    • retainCount方法返回對當前的保持次數。
    • dealloc方法由需要釋放物件的例項變數以及釋放動態分配的記憶體的類實現。
  • NSObjec有很多方法可以查詢物件的執行時資訊。這些內省方法有助於找出物件在類層次中的位置,確定物件是否實現特定的方法,以及測試物件是否遵循某種協議。下面是部分方法
    • superclass和class方法(實現為類和例項方法)分別以Class物件的形式返回接收者的父類和類。
    • isKindOfClass:和isMemberOfClass:方法來確定物件屬於哪個類。後者用於測試接收者是否為指定類的例項。isSubclassOfClass:類方法則用於測試類的繼承性。
    • respondsToSelector:方法用於測試接收者是否實現由選擇器引數標識的方法。instancesRespondToSelector:類方法則用於測試給定類的例項是否實現指定的方法。
    • conformsToProtocol:方法用於測試接收者(物件或類)是否遵循給定的協議。
    • isEqual:和hash方法用於物件的比較。
    • description方法允許物件返回一個內容描述字串;這個方法的輸出經常用於除錯(“print object”命令),以及在格式化字串中和“%@”指示符一起表示物件。
  • 物件的編碼和解碼,下面的方法和物件的編解碼(作為歸檔過程的一部分)有關:
    • encodeWithCoder:和initWithCoder:是NSCoding協議僅有的方法。前者使物件可以對其例項變數進行編碼,後者則使物件可以根據解碼過的例項變數對自身進行初始化。
    • NSObject類中聲明瞭一些於物件編碼有關的方法:classForCoder:、replacementObjectForCoder:、和awakeAfterUsingCoder:。
  • 訊息的轉發
    • forwardInvocation:允許一個物件將訊息轉發給另一個物件。
  • 訊息的派發 
  • 在performSelector開頭的一些方法允許你延遲後派髮指定訊息,而且可以將訊息(同步或非同步的訊息)從輔助執行緒派發到主執行緒。