IOS 整體框架類圖值得收藏

Cocoa框架是iOS應用程序的基礎,了解Cocoa框架,對開發iOS應用有很大的幫助。

1、Cocoa是什么?

Cocoa是OS X和 iOS操作系統的程序的運行環境。

是什么因素使一個程序成為Cocoa程序呢?不是編程語言,因為在Cocoa開發中你可以使用各種語言;也不是開發工具,你可以在命令行上就可以創建

Cocoa程序。Cocoa程序可以這么說,它是由一些對象組成,而這些對象的類最后都是繼承于它們的根類

:NSObject。而且它們都是基于Objective-C運行環境的。

1.1、Cocoa框架

iOS中,Cocoa眾多框架中最重要最基本的兩個框架是:Foundation 和 UIKit。

Foundation 和界面無關,也可以說和界面無關的類基本是Foundation框架的,和界面相關的是UIKit框架。

這兩個框架在系統中處于的位置如圖:

1.2、Foundation框架

好吧,那我們看看兩個框架的類組織架構圖,第一個先看Foundation的,三個圖,包括了Foundation所以的類,圖中灰色的是iOS不支持的,灰色部分是OS X系統的。

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

值對象

集合

操作系統服務 包括下面三個:文件系統和URL進程間通訊。這個范疇中的大部分類代表不同的系統端口、套接字、和名字服務器,對實現底層的IPC很有用。NSPipe代表一個BSD管道,即一種進程間的單向通訊通道。線程和子任務。NSThread類使您可以創建多線程的程序,而各種鎖(lock)類則為彼此競爭的線程在訪問進程資源時提供各種控制機制。通過NSTask,您的程序可以分出 ? ? ?一個子進程來執行其它工作或進行進度監控。

通知

歸檔和序列化

表達式和條件判斷

Objective-C語言服務

1.3 UIKit框架

應用程序可以通過三種方式使用UIKit創建界面

在用戶界面工具(interface Buidler)從對象庫里 拖拽窗口,視圖或者其他的對象使用。

用代碼創建

通過繼承UIView類或間接繼承UIView類實現自定義用戶界面

框架類組織架構圖:

在圖中可以看出,responder 類是圖中最大分支的根類,UIResponder為處理響應事件和響應鏈

定義了界面和默認行為。當用戶用手指滾動列表或者在虛擬鍵盤上輸入時,UIKit就生成時間傳送給UIResponder響應鏈,直到鏈中有對象處理這個

事件。相應的核心對象,比如:UIApplication ?,UIWindow,UIView都直接或間接的從UIResponder繼承。

2、Cocoa對象

2.1 Objective-C是面向對象的語言

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

2.2?Objective-C的優點

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

動態類-運行時確定類的對象

動態綁定-運行時確定要調用的方法

動態加載--運行時為程序加載新的模塊

2.3 動態能力相關的isa指針

每個Objective-C對象都有一個隱藏的數據結構,這個數據結構是Objective-C對象的第一個成員變量,它就是isa指針。這個指針指向哪

呢?它指向一個類對象(class object

記住它是個對象,是占用內存空間的一個變量,這個對象在編譯的時候編譯器就生成了,專門來描述某個類的定義),這個類對象包含了Objective-C

對象的一些信息(為了區分兩個對象,我把前面提到的對象叫Objective-C對象),包括Objective-C對象的方法調度表,實現了什么協議等

等。這個包含信息就是Objective-C動態能力的根源了。

那我們看看isa指針類型的數據結構是什么樣的?如果拋開NSObject對象的其他的成員數據和變量,NSObject可以看成這樣:

@interface?NSObject??{

Class????isa;

}

不考慮@interface關鍵字在編譯時的作用,可以把NSObject更接近C語言結構表示為:

structNSObject{

Class?isa;

}

Class是用typedef 定義的

typedefstructobjc_class?*Class;

那NSObject可以這么寫了

structNSObject{

objc_class?*isa

}

那objc_class的結構是什么樣的呢?大概是這樣的:

structobjc_class?{

Class?isa;

Class?super_class;

constchar*name;

longversion;

longinfo;

longinstance_size;

structobjc_ivar_list?*ivars;

structobjc_method_list?**methodLists;

structobjc_cache?*cache;

structobjc_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 類對象,元類對象等關系。

圖中的箭頭都是指針的指向。

2.4 根類 NSObject

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

2.4.1 根類和根類協議

NSObject不但是個類名,NSObject也是個協議的名稱,參考NSObject協議, NSObject協議指定了根類必須實現的接口。

2.4.2 根類的主要方法:

分配、初始化、和復制:

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開頭的一些方法允許你延遲后派發指定消息,而且可以將消息(同步或異步的消息)從輔助線程派發到主線程。

2.5 Cocoa對象生命周期

對象的四種內存管理方式,如下圖所示

對象的生命周期—簡化視圖

保持接收到的對象

拷貝接收到的對象

自動釋放池

參考:

1、http://algorithm.com.au/downloads/talks/objective-c-internals/objective-c-internals.pdf

2、http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/Introduction/Introduction.html

3、http://www.cnblogs.com/csutanyu/archive/2011/12/12/Objective-C_memory_layout.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容