iOS Cocoa架構介紹

來源:互聯網
上載者:User

標籤:

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架構。
這兩個架構在系統中處於的位置

Cocoa 架構結構

1.2、Foundation架構

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

Foundation架構
Foundation架構
Foundation架構

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

類繼承關係圖

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

2.4 根類 NSObject

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

NSObject類

2.4.1 根類和根類協議

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

2.4.2 根類的主要方法:

1 分配、初始化、和複製:

  • alloc和allocWithZone:方法用於從某記憶體地區中分配一個對象記憶體,並使對象指向其運行時的類定義。
  • init方法是對象初始化。
  • new是一個將簡單的記憶體配置和初始化結合起來的方法。
  • copy和copyWithZone:

2 對象的保持和清理:

  • retain方法增加對象的保持次數。
  • release方法減少對象的保持次數。
  • autorelease方法也是減少對象的保持次數,但是以延遲的方式。
  • retainCount方法返回對當前的保持次數。
  • dealloc方法由需要釋放對象的執行個體變數以及釋放動態分配的記憶體的類實現。

3 內省和比較

NSObjec有很多方法可以查詢對象的運行時資訊。這些內省方法有助於找出對象在類層次中的位置,確定對象是否實現特定的方法,以及測試對象是否遵循某種協議。下面是部分方法 

  • superclass和class方法(實現為類和執行個體方法)分別以Class對象的形式返回接收者的父類和類。
  • 您可以通過isKindOfClass:和isMemberOfClass:方法來確定對象屬於哪個類。後者用於測試接收者是否為指定類的執行個體。
  • isSubclassOfClass:類方法則用於測試類別的繼承性。
  • respondsToSelector:方法用於測試接收者是否實現由選取器參數標識的方法。instancesRespondToSelector:類方法則用於測試給定類的執行個體是否實現指定的方法。
  • conformsToProtocol:方法用於測試接收者(對象或類)是否遵循給定的協議。
  • isEqual:和hash方法用於對象的比較。
  • description方法允許對象返回一個內容描述字串;這個方法的輸出經常用於調試(“print object”命令),以及在格式化字串中和“%@”指示符一起表示對象。

4 對象的編碼和解碼

下面的方法和對象的編解碼(作為歸檔過程的一部分)有關:

  • encodeWithCoder:和initWithCoder:是NSCoding協議僅有的方法。前者使對象可以對其執行個體變數進行編碼,後者則使對象可以根據解碼過的執行個體變數對自身進行初始化。

NSObject類中聲明了一些於對象編碼有關的方法:classForCoder:、replacementObjectForCoder:、和awakeAfterUsingCoder:。

5 訊息的轉寄

forwardInvocation:允許一個對象將訊息轉寄給另一個對象。

6 訊息的派發 

在performSelector開頭的一些方法允許你延遲後派髮指定訊息,而且可以將訊息(同步或非同步訊息)從輔助線程派發到主線程。

2.5 Cocoa對象生命週期

對象的四種記憶體管理方式,如所示

1 對象的生命週期—簡化視圖

對象的生命週期

2 保持接收到的對象

保持接收到的對象

3 拷貝接收到的對象

拷貝接收到的對象

4 自動釋放池

自動釋放池

參考:

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

轉自Cocoa 架構 For iOS(一) 架構的介紹,Objectivie-C運行時能力的解析等

iOS Cocoa架構介紹

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.