iOS Cocoa框架介紹

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

一、Cocoa是什麼?

Cocoa是OS X和 iOS操做系統的程序的運行環境。
是什麼因素使一個程序成爲Cocoa程序呢?不是編程語言,由於在Cocoa開發中你可使用各類語言;也不是開發工具,你能夠在命令行上就能夠建立Cocoa程序。Cocoa程序能夠這麼說,它是由一些對象組成,而這些對象的類最後都是繼承於它們的根類 :NSObject。並且它們都是基於Objective-C運行環境的。objective-c

1.一、Cocoa框架

iOS中,Cocoa衆多框架中最重要最基本的兩個框架是:Foundation 和 UIKit。
Foundation 和界面無關,也能夠說和界面無關的類基本是Foundation框架的,和界面相關的是UIKit框架。
這兩個框架在系統中處於的位置如圖:編程

Cocoa 框架結構Cocoa 框架結構服務器

1.二、Foundation框架

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

Foundation框架Foundation框架
Foundation框架Foundation框架
Foundation框架Foundation框架
多線程

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

  • 值對象
  • 集合 
  • 操做系統服務 包括下面三個:
    • 文件系統和URL
    • 進程間通信:這個範疇中的大部分類表明不一樣的系統端口、套接字、和名字服務器,對實現底層的IPC頗有用。NSPipe表明一個BSD管道,即一種進程間的單向通信通道.
    • 線程和子任務: NSThread類使您能夠建立多線程的程序,而各類鎖(lock)類則爲彼此競爭的線程在訪問進程資源時提供各類控制機制。經過NSTask,您的程序能夠分出一個子進程來執行其它工做或進行進度監控。
  • 通知
  • 歸檔和序列化
  • 表達式和條件判斷
  • Objective-C語言服務

1.3 UIKit框架

應用程序能夠經過三種方式使用UIKit建立界面app

  • 在用戶界面工具(interface Buidler)從對象庫裏 拖拽窗口,視圖或者其餘的對象使用。
  • 用代碼建立
  • 經過繼承UIView類或間接繼承UIView類實現自定義用戶界面

框架類組織架構圖:框架

框架類組織架構圖框架類組織架構圖異步

在圖中能夠看出,responder 類是圖中最大分支的根類,UIResponder爲處理響應事件和響應鏈 定義了界面和默認行爲。當用戶用手指滾動列表或者在虛擬鍵盤上輸入時,UIKit就生成時間傳送給UIResponder響應鏈,直到鏈中有對象處理這個事件。相應的核心對象,好比:UIApplication ,UIWindow,UIView都直接或間接的從UIResponder繼承。

二、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類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 自動釋放池

自動釋放池自動釋放池

參考:

一、http://algorithm.com.au/downloads/talks/objective-c-internals/objective-c-internals.pdf
二、http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/Introduction/Introduction.html
三、http://www.cnblogs.com/csutanyu/archive/2011/12/12/Objective-C_memory_layout.html

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

相關文章
相關標籤/搜索