Cocoa 框架
Cocoa框架是iOS應(yīng)用程序的基礎(chǔ),了解Cocoa框架,對(duì)開發(fā)iOS應(yīng)用有很大的幫助。
1、Cocoa是什么?
Cocoa是OS X和 iOS操作系統(tǒng)的程序的運(yùn)行環(huán)境。
是什么因素使一個(gè)程序成為Cocoa程序呢?不是編程語言,因?yàn)樵贑ocoa開發(fā)中你可以使用各種語言;也不是開發(fā)工具,你可以在命令行上就可以創(chuàng)建Cocoa程序。Cocoa程序可以這么說,它是由一些對(duì)象組成,而這些對(duì)象的類最后都是繼承于它們的根類 :NSObject。而且它們都是基于Objective-C運(yùn)行環(huán)境的。
1.1、Cocoa框架
iOS中,Cocoa眾多框架中最重要最基本的兩個(gè)框架是:Foundation 和 UIKit。
Foundation 和界面無關(guān),也可以說和界面無關(guān)的類基本是Foundation框架的,和界面相關(guān)的是UIKit框架。
這兩個(gè)框架在系統(tǒng)中處于的位置如圖:
1.2、Foundation框架
好吧,那我們看看兩個(gè)框架的類組織架構(gòu)圖,第一個(gè)先看Foundation的,三個(gè)圖,包括了Foundation所以的類,圖中灰色的是iOS不支持的,灰色部分是OS X系統(tǒng)的。
??
將上圖Foundation框架中的類進(jìn)行邏輯分類如下:
1.3 UIKit框架
應(yīng)用程序可以通過三種方式使用UIKit創(chuàng)建界面框架類組織架構(gòu)圖:
在圖中可以看出,responder 類是圖中最大分支的根類,UIResponder為處理響應(yīng)事件和響應(yīng)鏈 定義了界面和默認(rèn)行為。當(dāng)用戶用手指滾動(dòng)列表或者在虛擬鍵盤上輸入時(shí),UIKit就生成時(shí)間傳送給UIResponder響應(yīng)鏈,直到鏈中有對(duì)象處理這個(gè)事件。相應(yīng)的核心對(duì)象,比如:UIApplication ?,UIWindow,UIView都直接或間接的從UIResponder繼承。
?2、Cocoa對(duì)象
2.1 Objective-C是面向?qū)ο蟮恼Z言
Objective-C和Java C++一樣,有封裝,繼承,多態(tài),重用。但是它不像C++那樣有重載操作法、模版和多繼承,也沒有Java的垃圾回收機(jī)制。
2.2?Objective-C的優(yōu)點(diǎn)
Objective-C語言有C++ Java等面向?qū)ο蟮奶攸c(diǎn),那是遠(yuǎn)遠(yuǎn)不能體現(xiàn)它的優(yōu)點(diǎn)的。Objective-C的優(yōu)點(diǎn)是它是動(dòng)態(tài)的。動(dòng)態(tài)能力有三種:
動(dòng)態(tài)類-運(yùn)行時(shí)確定類的對(duì)象
動(dòng)態(tài)綁定-運(yùn)行時(shí)確定要調(diào)用的方法
動(dòng)態(tài)加載--運(yùn)行時(shí)為程序加載新的模塊
2.3 動(dòng)態(tài)能力相關(guān)的isa指針
每個(gè)Objective-C對(duì)象都有一個(gè)隱藏的數(shù)據(jù)結(jié)構(gòu),這個(gè)數(shù)據(jù)結(jié)構(gòu)是Objective-C對(duì)象的第一個(gè)成員變量,它就是isa指針。這個(gè)指針指向哪呢?它指向一個(gè)類對(duì)象(class object ?記住它是個(gè)對(duì)象,是占用內(nèi)存空間的一個(gè)變量,這個(gè)對(duì)象在編譯的時(shí)候編譯器就生成了,專門來描述某個(gè)類的定義),這個(gè)類對(duì)象包含了Objective-C對(duì)象的一些信息(為了區(qū)分兩個(gè)對(duì)象,我把前面提到的對(duì)象叫Objective-C對(duì)象),包括Objective-C對(duì)象的方法調(diào)度表,實(shí)現(xiàn)了什么協(xié)議等等。這個(gè)包含信息就是Objective-C動(dòng)態(tài)能力的根源了。
那我們看看isa指針類型的數(shù)據(jù)結(jié)構(gòu)是什么樣的?如果拋開NSObject對(duì)象的其他的成員數(shù)據(jù)和變量,NSObject可以看成這樣:
[cpp]?view plaincopy
[cpp]?view plaincopy
[cpp]?view plaincopy
[cpp]?view plaincopy
[cpp]?view plaincopy
? ?為了得到整個(gè)類組織架構(gòu)的信息,objc_class結(jié)構(gòu)里定義了第二個(gè)成員變量Class super_class,它指向父類的類對(duì)象。說了這么多,可能關(guān)系縷不清楚,有道是一張圖勝過千言萬語
圖中可以看出,D3繼承D2,D2繼承D1,D1最終繼承NSObject。下圖從D3的一個(gè)對(duì)象開始,排列出D3 D2 D1 NSObject 類對(duì)象,元類對(duì)象等關(guān)系。
圖中的箭頭都是指針的指向。
2.4 根類 NSObject
NSObject是大部分Objective-C類的根類,它沒有父類。其它類繼承NSObject,訪問Objective-C運(yùn)行時(shí)系統(tǒng)的基本接口,這樣其他類的實(shí)例可以獲得運(yùn)行時(shí)的能力。
2.4.1 根類和根類協(xié)議
NSObject不但是個(gè)類名,NSObject也是個(gè)協(xié)議的名稱,參考NSObject協(xié)議?, NSObject協(xié)議指定了根類必須實(shí)現(xiàn)的接口。
2.4.2 根類的主要方法:
- ? ? 分配、初始化、和復(fù)制:
alloc和allocWithZone:方法用于從某內(nèi)存區(qū)域中分配一個(gè)對(duì)象內(nèi)存,并使對(duì)象指向其運(yùn)行時(shí)的類定義。init方法是對(duì)象初始化。
new是一個(gè)將簡(jiǎn)單的內(nèi)存分配和初始化結(jié)合起來的方法。
copy和copyWithZone:
- 對(duì)象的保持和清理:
retain方法增加對(duì)象的保持次數(shù)。release方法減少對(duì)象的保持次數(shù)。
autorelease方法也是減少對(duì)象的保持次數(shù),但是以推遲的方式。
retainCount方法返回對(duì)當(dāng)前的保持次數(shù)。
dealloc方法由需要釋放對(duì)象的實(shí)例變量以及釋放動(dòng)態(tài)分配的內(nèi)存的類實(shí)現(xiàn)。
- 內(nèi)省和比較
NSObjec有很多方法可以查詢對(duì)象的運(yùn)行時(shí)信息。這些內(nèi)省方法有助于找出對(duì)象在類層次中的位置,確定對(duì)象是否實(shí)現(xiàn)特定的方法,以及測(cè)試對(duì)象是否遵循某種協(xié)議。下面是部分方法?
superclass和class方法(實(shí)現(xiàn)為類和實(shí)例方法)分別以Class對(duì)象的形式返回接收者的父類和類。
您可以通過isKindOfClass:和isMemberOfClass:方法來確定對(duì)象屬于哪個(gè)類。后者用于測(cè)試接收者是否為指定類的實(shí)例。isSubclassOfClass:類方法則用于測(cè)試類的繼承性。
respondsToSelector:方法用于測(cè)試接收者是否實(shí)現(xiàn)由選擇器參數(shù)標(biāo)識(shí)的方法。instancesRespondToSelector:類方法則用于測(cè)試給定類的實(shí)例是否實(shí)現(xiàn)指定的方法。
conformsToProtocol:方法用于測(cè)試接收者(對(duì)象或類)是否遵循給定的協(xié)議。
isEqual:和hash方法用于對(duì)象的比較。
description方法允許對(duì)象返回一個(gè)內(nèi)容描述字符串;這個(gè)方法的輸出經(jīng)常用于調(diào)試(“print object”命令),以及在格式化字符串中和“%@”指示符一起表示對(duì)象。
- 對(duì)象的編碼和解碼
下面的方法和對(duì)象的編解碼(作為歸檔過程的一部分)有關(guān):
encodeWithCoder:和initWithCoder:是NSCoding協(xié)議僅有的方法。前者使對(duì)象可以對(duì)其實(shí)例變量進(jìn)行編碼,后者則使對(duì)象可以根據(jù)解碼過的實(shí)例變量對(duì)自身進(jìn)行初始化。
NSObject類中聲明了一些于對(duì)象編碼有關(guān)的方法:classForCoder:、replacementObjectForCoder:、和awakeAfterUsingCoder:。
- 消息的轉(zhuǎn)發(fā)
?forwardInvocation:允許一個(gè)對(duì)象將消息轉(zhuǎn)發(fā)給另一個(gè)對(duì)象。
- 消息的派發(fā)?
在performSelector開頭的一些方法允許你延遲后派發(fā)指定消息,而且可以將消息(同步或異步的消息)從輔助線程派發(fā)到主線程。
2.5 Cocoa對(duì)象生命周期
對(duì)象的四種內(nèi)存管理方式,如下圖所示
- ?對(duì)象的生命周期—簡(jiǎn)化視圖
- 保持接收到的對(duì)象
- 拷貝接收到的對(duì)象
- 自動(dòng)釋放池
參考:
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
總結(jié)
- 上一篇: 博客搬家QAQ
- 下一篇: symbol是c语言标识符,symbol