Cocoa包含兩個(gè)主要的Objective-C對(duì)象庫闻丑,稱為“框架”关顷⌒舷恚框架的功能類似于動(dòng)態(tài)庫洽腺,即可以在運(yùn)行時(shí)動(dòng)態(tài)的載入應(yīng)用程序的地址空間脚粟,但框架作為一個(gè)捆綁 (計(jì)算機(jī))而非獨(dú)立文件,其中除了可執(zhí)行代碼外蘸朋,也包含了資源核无,頭文件和文檔。
“Foundation工具包”藕坯,或簡稱為“Foundation”团南,首先出現(xiàn)在OpenStep中。在Mac OS X中炼彪,它是基于Core Foundation的吐根。作為通用的面向?qū)ο?/a>的函數(shù)庫,F(xiàn)oundation提供了字符串辐马,數(shù)值的管理佑惠,容器及其枚舉,分布式計(jì)算,事件循環(huán)膜楷,以及一些其它的與圖形用戶界面沒有直接關(guān)系的功能旭咽。其中用于類和常數(shù)的“NS”前綴來自于Cocoa的來源,NeXTSTEP赌厅。它可以在Mac OS X和iOS中使用穷绵。
“用戶界面工具包”,或稱UIKit(UserInterfaceKit)特愿,是用于iOS的圖形用戶界面工具包仲墨。與AppKit不同,它使用“UI”的前綴揍障。
(MAC OS X中使用)“應(yīng)用程序工具包”目养,或稱AppKit(ApplicationKit)是直接衍生自NeXTSTEP的AppKit的。它包含了程序與圖形用戶界面交互所需的代碼毒嫡。它是基于Foundation建立的癌蚁,也使用“NS”前綴。它只能在Mac OS X中使用兜畸。
Cocoa構(gòu)架的一個(gè)關(guān)鍵部分是其多樣的視圖模型努释。總體而言咬摇,它是基于由Quartz提供的PDF繪制模型的伐蒂,該特性允許使用PostScript繪制自定義圖形內(nèi)容,同時(shí)也自動(dòng)的支持了打印機(jī)以及類似設(shè)備肛鹏。由于Cocoa框架管理了全部的繪圖操作逸邦,例如裁剪,滾動(dòng)在扰,縮放等缕减,程序員可以不再重復(fù)實(shí)現(xiàn)基礎(chǔ)的功能,而可以集中于提供程序的關(guān)鍵功能上健田。
動(dòng)態(tài)綁定
在Objective-C中甥啄,消息由selector所代表存炮,其為描述需要調(diào)用的方法的一個(gè)字符串。在發(fā)送消息時(shí),該selector被送入Objective-C運(yùn)行時(shí)中穆桂,在可用方法列表中尋找對(duì)應(yīng)的方法宫盔,然后調(diào)用該方法的實(shí)際實(shí)現(xiàn)。由于selector只是文本數(shù)據(jù)享完,因此它可以保存在文件中灼芭,通過網(wǎng)絡(luò)或在進(jìn)程間傳輸,或以其它方式進(jìn)行操作般又。方法的實(shí)現(xiàn)是在運(yùn)行時(shí)查找的彼绷,而非編譯時(shí)。這樣的做法會(huì)造成一些性能損失茴迁,但動(dòng)態(tài)綁定允許相同的selector代表不同的實(shí)現(xiàn)寄悯。
利用這些特性,Cocoa提供了一種通用的數(shù)據(jù)管理技術(shù)堕义,稱為鍵-值編碼(KVC)猜旬。這種技術(shù)允許對(duì)象的數(shù)據(jù)或?qū)傩钥梢栽谶\(yùn)行時(shí)通過其鍵名進(jìn)行查找,其中胳螟,屬性的名稱即為其值的鍵名昔馋。在靜態(tài)語言中,這樣的做法是不可能的糖耸。KVC大大的增加了設(shè)計(jì)的自由度:通過KVC秘遏,無需知道對(duì)象的類型即可訪問其屬性或數(shù)據(jù)。另外嘉竟,利用鍵-值-觀測(cè)器(KVO)技術(shù)和NSUndoManager類邦危,可以提供自動(dòng)的撤銷/重做支持。
內(nèi)存管理
Cocoa環(huán)境的一個(gè)特點(diǎn)是它可以管理動(dòng)態(tài)分配的內(nèi)存舍扰。Cocoa中絕大部分類的基類都是NSObject倦蚪,它實(shí)現(xiàn)了引用計(jì)數(shù)的內(nèi)存管理模型。從NSObject繼承的類可以響應(yīng)retain和release消息边苹,以增減其引用計(jì)數(shù)陵且;也可以通過發(fā)送retainCount消息來獲取其引用計(jì)數(shù)。一個(gè)以alloc个束,copy或Objective-C 2.0中增加的new所創(chuàng)建的對(duì)象的引用計(jì)數(shù)為1慕购;向?qū)ο蟀l(fā)送retain消息會(huì)將計(jì)數(shù)加1,而發(fā)送release消息則會(huì)將計(jì)數(shù)減1茬底。若對(duì)象的引用計(jì)數(shù)減少到了0沪悲,則它會(huì)被銷毀。dealloc消息類似于C++中的析構(gòu)函數(shù)阱表,在對(duì)象被銷毀之前可能會(huì)被調(diào)用殿如,但系統(tǒng)不保證會(huì)發(fā)送該消息贡珊。這種引用計(jì)數(shù)的模型與微軟的COM中的IUnknown接口特性十分相似,它提供了AddRef和Release接口涉馁,與retain和release對(duì)應(yīng)门岔。
從Objective-C 2.0開始,Objective-C運(yùn)行時(shí)實(shí)現(xiàn)了可選的垃圾收集器谨胞。若垃圾收集的特性被激活固歪,則運(yùn)行時(shí)會(huì)將引用計(jì)數(shù)相關(guān)的操作,例如“retain”和“release”胯努,變?yōu)闊o操作牢裳。iOS上的Objective-C 2.0實(shí)現(xiàn)中不包含垃圾收集器。垃圾收集器運(yùn)行在一個(gè)低優(yōu)先級(jí)的后臺(tái)線程中叶沛,并可以在用戶動(dòng)作時(shí)暫停蒲讯,從而保持良好的用戶體驗(yàn)。