1.Cocoa是什么?
Cocoa是OS X和iOS操作系統(tǒng)的程序的運(yùn)行環(huán)境,在iOS正確的說法是Cocoa Touch
是什么因素使一個程序成為Cocoa程序呢?不是編程語言,因?yàn)樵贑ocoa開發(fā)中你可以使用各種語言;也不是開發(fā)工具,你可以在命令行上就可以創(chuàng)建Cocoa程序。Cocoa程序可以這么說,它是由一些對象組成,而這些對象的類最后都是繼承與它們的根類:NSObject。而且它們都是基于Object-C運(yùn)行環(huán)境的。
請注意:上面的說法還需要做一點(diǎn)限制。首先,Cocoa還有另一個根類,即NSProxy。只是NSProxy很少用于Cocoa編程。其次,您可以創(chuàng)建您自己的根類,只是這需要很多工作(包括編寫與Objective-C運(yùn)行環(huán)境進(jìn)行交互的代碼),而且為此花費(fèi)時間可能是不值得的。
1.1:Cocoa框架
iOS中,Cocoa眾多框架中最重要最基礎(chǔ)的兩個框架是:Foundation和UIKit。
Foundation和界面無關(guān),也可以說和界面無關(guān)的類基本是Foundation框架的,和界面相關(guān)的是UIKit框架。
這兩個框架在系統(tǒng)中處于的位置如圖:
這兩個框架在系統(tǒng)中處于的位置如圖:

1.2:Foundation框架
看看兩個框架的類組織結(jié)構(gòu)圖,第一個先看Foundation的,三個圖,包括了Foundation所以的類,圖中灰色的是iOS不支持的,灰色部分是OS X系統(tǒng)的。
Foundation框架類組織結(jié)構(gòu)圖:
將上圖Foundation框架中的類進(jìn)行邏輯分類如下:
值對象
集合?
操作系統(tǒng)服務(wù) 包括下面三個:文件系統(tǒng)和URL進(jìn)程間通訊。這個范疇中的大部分類代表不同的系統(tǒng)端口、套接字、和名字服務(wù)器,對實(shí)現(xiàn)底層的IPC很有用。NSPipe代表一個BSD管道,即一種進(jìn)程間的單向通訊通道。線程和子任務(wù)。NSThread類使您可以創(chuàng)建多線程的程序,而各種鎖(lock)類則為彼此競爭的線程在訪問進(jìn)程資源時提供各種控制機(jī)制。通過NSTask,您的程序可以分出 一個子進(jìn)程來執(zhí)行其它工作或進(jìn)行進(jìn)度監(jiān)控。
通知
歸檔和序列化
表達(dá)式和條件判斷
Objective-C語言服務(wù)
1.3UIKit框架
應(yīng)用程序可以通過三種方式使用UIKit創(chuàng)建界面
1.在用戶界面工具(interface Buidler)從對象庫里拖拽窗口,視圖或者其他的對象使用。
2.用代碼創(chuàng)建。
3.通過繼承UIView類或間接繼承UIView類實(shí)現(xiàn)自定義用戶界面。
responder類是圖中最大分支的根類,UIResponder為處理響應(yīng)事件和響應(yīng)鏈定義了界面和默認(rèn)行為。當(dāng)用戶用手指滾動列表或者在虛擬鍵盤上輸入時,UIKit就生成時間傳送給UIResponder響應(yīng)鏈,直到鏈中有對象處理這個事件。響應(yīng)的核心對象,比如:UIApplication,UIWindow,UIView都直接或間接的從UIResponder繼承。
2.Cocoa對象
2.1Object-C是面向?qū)ο蟮恼Z言
Object-C和Java C++一樣,有封裝,繼承,多態(tài),重用。但是它不像C++那樣有重載操作法,模板和多繼承,沒有Java的垃圾回收機(jī)制。
2.2Object-C的優(yōu)點(diǎn)
Object-C語言有C++ Java等面向?qū)ο蟮奶攸c(diǎn),那是遠(yuǎn)遠(yuǎn)不能體現(xiàn)它的優(yōu)點(diǎn)的。Object-C的優(yōu)點(diǎn)是它是動態(tài)的。
動態(tài)能力有三種:
動態(tài)類-運(yùn)行時確定類的對象
動態(tài)綁定-運(yùn)行時確定要調(diào)用的方法
動態(tài)加載-運(yùn)行時為程序加載新的模塊
2.3動態(tài)能力相關(guān)的isa指針
每個Object-C對象都有一個隱藏的數(shù)據(jù)結(jié)構(gòu),這個數(shù)據(jù)結(jié)構(gòu)是Object-C對象的第一個成員變量,它就是isa指針。這個指針指向哪呢?它指向一個類對象(class Object記住它是個對象,是占用內(nèi)存空間額一個變量,這個對象在編譯的時候編譯器就生成了,專門來描述某個類的定義),這個類對象包含了Object-C對象的一些信息(為了區(qū)分兩個對象,我把前面提到的對象叫Object-C對象),包括Object-C對象的方法調(diào)度表,實(shí)現(xiàn)了什么協(xié)議等等。這個包含信息就是Object-C動態(tài)能力的根源了。
那我們看看isa指針類型的數(shù)據(jù)結(jié)構(gòu)是什么樣的?如果拋開NSObject對象的其他的成員數(shù)據(jù)和變量,NSObject可以看成這樣:
@interface?NSObject?<NSObject>?{??
?????Class????isa;??
}?
一共三次:類對象->元類對象->NSObject元類對象。
2.4根類NSObject
NSObject是大部分Object-C類的根類,它沒有父類。其它類繼承NSObject,訪問Object-C運(yùn)行時系統(tǒng)的基本接口,這樣其他類的實(shí)例可以獲得運(yùn)行時的能力。
2.4.1根類的根類協(xié)議
NSObject不但是個類名,NSObject也是個協(xié)議的名稱,參考NSObject協(xié)議,NSObject協(xié)議指定了根類必須實(shí)現(xiàn)的接口。
2.4.2根類的主要方法:
1.分配,初始化,和復(fù)制:
alloc和allocWithZone:方法用于從某內(nèi)存區(qū)域中分配一個對象內(nèi)存,并使對象指向其運(yùn)行時的類定義。
init方法是對象初始化。
new是一個將簡單的內(nèi)存分配和初始化結(jié)合起來的方法。
copy和copyWithZone:
2.對象的保持和清理:
retain方法增加對象的保持次數(shù)。
release方法減少對象的保持次數(shù)。
autorelease方法也是減少對象的保持次數(shù),但是以推遲的方式。
retainCount方法返回對當(dāng)前的保持次數(shù)。
dealloc方法由需要釋放對象的實(shí)例變量以及釋放動態(tài)分配的內(nèi)存的類實(shí)現(xiàn)。
3.內(nèi)省和比較
NSObject有很多方法可以查詢對象的運(yùn)行時信息。這些內(nèi)省方法有助于找出對象在類層次中的位置,確定對象是否實(shí)現(xiàn)特定的方法,以及測試對象是否遵循某種協(xié)議。下面是部分方法
superclass和class方法(實(shí)現(xiàn)為類和實(shí)例方法)分別以class對象的形式返回接收者的父類和類。
你可以通過isKindOfClass:和isMemberOfClass:方法來確定對象屬于哪個類。后者用于測試接收者是否為指定類的實(shí)例。isSubclassOfClass:類方法則用于測試類的繼承性。
respondsToSelecor:方法用于測試接收者是否實(shí)現(xiàn)由選擇器參數(shù)標(biāo)識的方法。instancesRespondToSelector:類方法則用于測試給定類的實(shí)例是否實(shí)現(xiàn)指定的方法。
conformsToProtocol:方法用于測試接收者(對象或類)是否遵循給定的協(xié)議。
isEqual:和hash方法用于對象的比較。
description方法允許對象返回一個內(nèi)容描述字符串;這個方法的輸出經(jīng)常用于調(diào)試(“print object”命令),以及在格式化字符串中和“%@”指示符一起表示對象。
4.對象的編碼和解碼
下面的方法和對象的編解碼(作為歸檔過程的一部分)有關(guān):
encodeWithCoder:和initWithCoder:是NSCoding協(xié)議僅有的方法。前者使對象可以對其實(shí)例變量進(jìn)行編碼,后者則使對象可以根據(jù)解碼過得實(shí)例變量對自身進(jìn)行初始化。
NSObject類中聲明了一些于對象編碼有關(guān)的方法:classForCoder:,replacementObjectForCoder:,和awakeAfterUsingCoder:。
5.消息的轉(zhuǎn)發(fā)
forwardInvocation:允許一個對象將消息轉(zhuǎn)發(fā)給另一個對象。
6.消息的派發(fā)
在performSelector開頭的一些方法允許你延遲后派發(fā)指定消息,而且可以將消息(同步或異步的消息)從輔助線程派發(fā)到主線程。
3.Cocoa對象生命周期
對象的四種內(nèi)存管理方式,如下圖所示


