iOS 整體框架及類繼承框架圖

一 整體框架

在iOS開發(fā)過程中,對iOS整體框架的了解和學(xué)習(xí)是必不可少的一個環(huán)節(jié),今天我們就好好來了解一下iOS的整體框架。首先貼一個關(guān)于iOS的框架介紹:iOS系統(tǒng)框架概述。我們通常稱呼iOS的框架為Cocoa Touch框架,Cocoa Touch是一個框架的集合,里面包含了眾多的子框架。每一個子框架都是一個目錄,包含了共享資源庫,用于訪問該資源庫中儲存的代碼的頭文件,以及圖像、聲音文件等其他資源,共享資源庫定義應(yīng)用程序可以調(diào)用的函數(shù)和方法。框架中的類相互依賴構(gòu)成一個整體,提供完善的某一方面的服務(wù)或解決方案,多個框架一起實現(xiàn)整個應(yīng)用程序的結(jié)構(gòu)。由于應(yīng)用程序的結(jié)構(gòu)是通用的,開發(fā)者通過框架提供的函數(shù)和方法,做細致個性化的處理,從而滿足不同應(yīng)用的不同需求。開發(fā)一個應(yīng)用程序就是將需求細致化的代碼插入到框架提供的設(shè)計中來組合成一個整體完成最終的應(yīng)用設(shè)計。

1.1 iOS系統(tǒng)架構(gòu)

iOS的整體系統(tǒng)框架圖如下圖所示,iOS的系統(tǒng)架構(gòu)主要由
Application Layer(應(yīng)用層)、
Cocoa Touch Layer(觸摸層)、
Media Layer (媒體層)、
Core Services Layer(核心服務(wù)層)、
Core OS Layer (核心系統(tǒng)操作層)、
The Kernel and Device Drivers layer(內(nèi)核和驅(qū)動層)。

image

了解了系統(tǒng)架構(gòu),那么每一層的主要功能是什么呢?下圖就是iOS8.3系統(tǒng)的框架架構(gòu)圖,最新的圖沒有找到,現(xiàn)在iOS11中新增了一些功能模塊,但是整體的框架大同小異。

image
  • Cocoa Touch Layer
    觸摸層提供應(yīng)用基礎(chǔ)的關(guān)鍵技術(shù)支持和應(yīng)用的外觀。如NotificationCenter的本地通知和遠程推送服務(wù),iAd廣告框架,GameKit游戲工具框架,消息UI框架,圖片UI框架,地圖框架,連接手表框架,UIKit框架、自動適配等等

  • Media Layer
    媒體層提供應(yīng)用中視聽方面的技術(shù),如圖形圖像相關(guān)的CoreGraphics,CoreImage,GLKit,OpenGL ES,CoreText,ImageIO等等。聲音技術(shù)相關(guān)的CoreAudio,OpenAL,AVFoundation,視頻相關(guān)的CoreMedia,Media Player框架,音視頻傳輸?shù)腁irPlay框架等等

  • Core Services Layer
    系統(tǒng)服務(wù)層提供給應(yīng)用所需要的基礎(chǔ)的系統(tǒng)服務(wù)。如Accounts賬戶框架,廣告框架,數(shù)據(jù)存儲框架,網(wǎng)絡(luò)連接框架,地理位置框架,運動框架等等。這些服務(wù)中的最核心的是CoreFoundation和Foundation框架,定義了所有應(yīng)用使用的數(shù)據(jù)類型。CoreFoundation是基于C的一組接口,F(xiàn)oundation是對CoreFoundation的OC封裝

  • Core OS Layer
    系統(tǒng)核心層包含大多數(shù)低級別接近硬件的功能,它所包含的框架常常被其它框架所使用。Accelerate框架包含數(shù)字信號,線性代數(shù),圖像處理的接口。針對所有的iOS設(shè)備硬件之間的差異做優(yōu)化,保證寫一次代碼在所有iOS設(shè)備上高效運行。CoreBluetooth框架利用藍牙和外設(shè)交互,包括掃描連接藍牙設(shè)備,保存連接狀態(tài),斷開連接,獲取外設(shè)的數(shù)據(jù)或者給外設(shè)傳輸數(shù)據(jù)等等。Security框架提供管理證書,公鑰和私鑰信任策略,keychain,hash認(rèn)證數(shù)字簽名等等與安全相關(guān)的解決方案。

上面的每一模塊只是簡單滴介紹了大致功能,更多詳細信息大家可以 戳這里看大神的博客了解更多:iOS總體框架介紹和詳盡說明。顯然,在上面所有的框架中,最重要也最經(jīng)常使用的就是UIKitFoundation框架。

1.2 官方文檔

官方文檔戳這里??!
解釋一下,官方文檔中將OS體系分為四層,如下圖所示,沒有Cocoa Touch Layer和Application Layer,取而代之的是Cocoa (Application) Layer。我們再細看官網(wǎng)的對Cocoa (Application) Layer的官方解釋如下,說的是該層是為創(chuàng)建App提供了用戶界面基礎(chǔ),響應(yīng)用戶事件,并且可以管理App的行為。這其實就是Cocoa Touch Layer(觸摸層,UIKit)的作用,只是官網(wǎng)省略了Application Layer(應(yīng)用層),因為這一層主要就是app了,主要由開發(fā)人員完成。其他的資料大家自行根據(jù)官方文檔查看,在這里就不過多進行解讀和分析了。

  • The Cocoa (Application) layer includes technologies for building an app’s user interface, for responding to user events, and for managing app behavior.
image

二 Cocoa框架的類繼承體系

Cocoa框架是iOS應(yīng)用程序的基礎(chǔ),是OS X和 iOS操作系統(tǒng)的程序的運行環(huán)境,了解Cocoa框架,對開發(fā)iOS應(yīng)用有很大的幫助。iOS中,Cocoa眾多框架中最重要最基本的兩個框架是:Foundation 和 UIKit。這兩個框架基本包含了iOS、OS X開發(fā)過程中要用到的絕大多數(shù)OC類,因此這兩個框架是Cocoa框架其中Foundation 和界面無關(guān),也可以說和界面無關(guān)的類基本是Foundation框架的,和界面相關(guān)的是UIKit框架
  之前在學(xué)習(xí)Java和Android時,Java和Android提供了非常詳盡的系統(tǒng)框架,并在API的索引中中對Java和Android的類繼承體系和分類都非常明晰,而在iOS開發(fā)過程中,API中類的聚合是按照功能和作用劃分模塊,對iOS中的類繼承體系沒有一個明確的介紹。而類繼承體系的了解有助于我們對iOS系統(tǒng)的整個模塊的體系框架有一個更為清晰的了解和認(rèn)識,對對應(yīng)類繼承體系中的類的特性和常規(guī)用法都有一個大致的認(rèn)識和了解。因此,這兩天得閑就對這一塊進行整理和學(xué)習(xí),對Cocoa框架中的最重要的Foundation 和 UIKit框架中的類繼承體系進行了梳理。

2.1 Foundation框架類繼承體系

Foundation框架為所有應(yīng)用程序提供基本的系統(tǒng)服務(wù)。應(yīng)用程序以及 UIKit和其他框架,都是建立在 Foundation 框架的基礎(chǔ)結(jié)構(gòu)之上。 Foundation框架提供許多基本的對象類和數(shù)據(jù)類型,使其成為應(yīng)用程序開發(fā)的基礎(chǔ)。它還制定了一些約定(如用于取消分配等任務(wù)),使代碼更加一致,可復(fù)用性更好。

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

image
image
image

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

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

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

2.2 UIKit框架類繼承體系

UIKitk框架提供一系列的Class(類)來建立和管理iOS應(yīng)用程序的用戶界面( UI )接口、應(yīng)用程序?qū)ο?、事件控制、繪圖模型、窗口、視圖和用于控制觸摸屏等的接口。框架的入口: #import <UIKit/UIKit.h> ,當(dāng)引入此頭文件后,便可以在程序里使用任何在UIKit里聲明的類。(PS: 當(dāng)然還要把這個框架鏈接到你的應(yīng)用程序中)。

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

應(yīng)用程序可以通過三種方式使用UIKit創(chuàng)建界面:

  1. 在用戶界面工具(interface Buidler)從對象庫里 拖拽窗口,視圖或者其他的對象使用。
  2. 用代碼創(chuàng)建
  3. 通過繼承UIView類或間接繼承UIView類實現(xiàn)自定義用戶界面

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

image

在圖中可以看出,responder 類是圖中最大分支的根類,UIResponder為處理響應(yīng)事件和響應(yīng)鏈 定義了界面和默認(rèn)行為。當(dāng)用戶用手指滾動列表或者在虛擬鍵盤上輸入時,UIKit就生成時間傳送給UIResponder響應(yīng)鏈,直到鏈中有對象處理這個 事件。相應(yīng)的核心對象,比如:UIApplication ,UIWindow,UIView都直接或間接的從UIResponder繼承 。UIKit框架的各個類的簡單介紹戳后面的鏈接:**UIKit框架各個類的簡要說明 **

三 Cocoa對象

此處內(nèi)容全部來源于: IOS 整體框架類圖值得收藏

3.1 Objective-C是面向?qū)ο蟮恼Z言

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

3.2 Objective-C的優(yōu)點

Objective-C語言有C++ Java等面向?qū)ο蟮奶攸c,那是遠遠不能體現(xiàn)它的優(yōu)點的。Objective-C的優(yōu)點是它是動態(tài)的。動態(tài)能力有三種:

  • 動態(tài)類——運行時確定類的對象
  • 動態(tài)綁定——運行時確定要調(diào)用的方法
  • 動態(tài)加載——運行時為程序加載新的模塊

3.3 動態(tài)能力相關(guān)的isa指針

每個Objective-C對象都有一個隱藏的數(shù)據(jù)結(jié)構(gòu),這個數(shù)據(jù)結(jié)構(gòu)是Objective-C對象的第一個成員變量,它就是isa指針。這個指針指向哪 呢?它指向一個類對象(class object 記住它是個對象,是占用內(nèi)存空間的一個變量,這個對象在編譯的時候編譯器就生成了,專門來描述某個類的定義),這個類對象包含了Objective-C 對象的一些信息(為了區(qū)分兩個對象,我把前面提到的對象叫Objective-C對象),包括Objective-C對象的方法調(diào)度表,實現(xiàn)了什么協(xié)議等 等。這個包含信息就是Objective-C動態(tài)能力的根源了。那我們看看isa指針類型的數(shù)據(jù)結(jié)構(gòu)是什么樣的?

如果拋開NSObject對象的其他的成員數(shù)據(jù)和變量,NSObject可以看成這樣:

@interface NSObject <NSObject> {  
     Class    isa;  
}

不考慮@interface關(guān)鍵字在編譯時的作用,可以把NSObject更接近C語言結(jié)構(gòu)表示為:

struct NSObject{  
   Class isa;  
 }

Class是用typedef 定義的: typedef struct objc_class *Class;那NSObject可以這么寫了

struct NSObject {  
  objc_class *isa  
}

那objc_class的結(jié)構(gòu)是什么樣的呢?大概是這樣的:

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;     
 }

這里會看到, 在這個結(jié)構(gòu)體里還有一個isa指針,又是一重指向,是不是有種到了盜夢空間的感覺。不用緊張,take easy,不會有那么多層次的,這里的isa指針指向的是元類對象(metaclass object),帶有元字,證明快到頭了。那元對象有啥用呢?它用來存儲的關(guān)于類的版本,名字,類方法等信息。所有的元類對象(metaclass object)都指向 NSObject的元類對象,到頭還是NSObject。一共三次:類對象->元類對象->NSObject元類對象。

為了得到整個類組織架構(gòu)的信息,objc_class結(jié)構(gòu)里定義了第二個成員變量Class super_class,它指向父類的類對象。說了這么多,可能關(guān)系縷不清楚,有道是一張圖勝過千言萬語

image.png

3.4 根類 NSObject

NSObject是大部分Objective-C類的根類,它沒有父類。其它類繼承NSObject,訪問Objective-C運行時系統(tǒng)的基本接口,這樣其他類的實例可以獲得運行時的能力。

  • 根類和根類協(xié)議:NSObject不但是個類名,NSObject也是個協(xié)議的名稱,參考NSObject協(xié)議 , NSObject協(xié)議指定了根類必須實現(xiàn)的接口。
  • 根類的主要方法:分配、初始化、復(fù)制
    • 分配:alloc和allocWithZone:方法用于從某內(nèi)存區(qū)域中分配一個對象內(nèi)存,并使對象指向其運行時的類定義。
    • 初始化:init方法是對象初始化。
    • new是一個將簡單的內(nèi)存分配和初始化結(jié)合起來的方法。
    • 復(fù)制:copy和copyWithZone
  • 對象的保持和清理:
    • retain方法增加對象的保持次數(shù)。
    • release方法減少對象的保持次數(shù)。
    • autorelease方法也是減少對象的保持次數(shù),但是以推遲的方式。
    • retainCount方法返回對當(dāng)前的保持次數(shù)。
    • dealloc方法由需要釋放對象的實例變量以及釋放動態(tài)分配的內(nèi)存的類實現(xiàn)。
  • NSObjec有很多方法可以查詢對象的運行時信息。這些內(nèi)省方法有助于找出對象在類層次中的位置,確定對象是否實現(xiàn)特定的方法,以及測試對象是否遵循某種協(xié)議。下面是部分方法
    • superclass和class方法(實現(xiàn)為類和實例方法)分別以Class對象的形式返回接收者的父類和類。
    • isKindOfClass:和isMemberOfClass:方法來確定對象屬于哪個類。后者用于測試接收者是否為指定類的實例。isSubclassOfClass:類方法則用于測試類的繼承性。
    • respondsToSelector:方法用于測試接收者是否實現(xiàn)由選擇器參數(shù)標(biāo)識的方法。instancesRespondToSelector:類方法則用于測試給定類的實例是否實現(xiàn)指定的方法。
    • conformsToProtocol:方法用于測試接收者(對象或類)是否遵循給定的協(xié)議。
    • isEqual:和hash方法用于對象的比較。
    • description方法允許對象返回一個內(nèi)容描述字符串;這個方法的輸出經(jīng)常用于調(diào)試(“print object”命令),以及在格式化字符串中和“%@”指示符一起表示對象。
  • 對象的編碼和解碼,下面的方法和對象的編解碼(作為歸檔過程的一部分)有關(guān):
    • encodeWithCoder:和initWithCoder:是NSCoding協(xié)議僅有的方法。前者使對象可以對其實例變量進行編碼,后者則使對象可以根據(jù)解碼過的實例變量對自身進行初始化。
    • NSObject類中聲明了一些于對象編碼有關(guān)的方法:classForCoder:、replacementObjectForCoder:、和awakeAfterUsingCoder:。
  • 消息的轉(zhuǎn)發(fā)
    • forwardInvocation:允許一個對象將消息轉(zhuǎn)發(fā)給另一個對象。
  • 消息的派發(fā)
  • 在performSelector開頭的一些方法允許你延遲后派發(fā)指定消息,而且可以將消息(同步或異步的消息)從輔助線程派發(fā)到主線程。

轉(zhuǎn)載自 - iOS 整體框架及類繼承框架圖
iOS學(xué)習(xí)——iOS 整體框架及類繼承框架圖
iOS總體框架介紹和詳盡說明

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,428評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,024評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,285評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,548評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,328評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,878評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,971評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,098評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,616評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,554評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,725評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,243評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,971評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,361評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,613評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,339評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,695評論 2 370

推薦閱讀更多精彩內(nèi)容

  • Cocoa框架是iOS應(yīng)用程序的基礎(chǔ),了解Cocoa框架,對開發(fā)iOS應(yīng)用有很大的幫助。 1、Cocoa是什么? ...
    CC_iOS閱讀 2,400評論 0 3
  • iOS整體框架 通常我們稱iOS的框架為cocoa框架.話不多說,官方的整體框架圖如下: 簡單解釋一下:Cocoa...
    7分醉閱讀 977評論 0 3
  • 6轉(zhuǎn)載-->>IOS框架和服務(wù) 在iOS中框架是一個目錄,包含了共享資源庫,用于訪問該資源庫中儲存的代碼的頭文件,...
    李小六_閱讀 3,628評論 2 24
  • 許久未念,我大概對你好像似乎沒了那股深切的思念之情。 噢,親愛的,請允許我再如此稱呼你。日子不知道過了多久,遠遠地...
    啦妹子啦閱讀 545評論 0 0
  • 七律 天龍山石窟感 文/黑茶山 輕狂楊柳風(fēng)剪影,石窟古來墨客吟。 山水濤聲云滿眼,精靈代代氣雙襟。 崢嶸歲月頻回首...
    黑茶山_c940閱讀 612評論 0 1