關(guān)于 Objective-C
當你編寫 OS X 和 iOS 軟件時,Objective-C 將是你主要使用的語言渤弛。它對 C 語言進行了拓展巾乳,并提供了面向?qū)ο蟮奶匦院蛣討B(tài)運行時。Objective-C 沿用了 C 語言的語法規(guī)則厂僧,原始類型扣草,和控制流語句,并加入了定義類和方法的語法規(guī)則颜屠。它在提供動態(tài)綁定和動態(tài)派發(fā)辰妙,推遲重要事項到運行時執(zhí)行的同時,也在語言層面上加入了對對象圖管理以及對象字面量的支持甫窟。
一瞥
這份文檔介紹了 Objective-C 語言并且大量的使用范例密浑。你將會學到如何通過創(chuàng)建自己的類來自定義對象,并且學會如何使用 Cocoa 和 Cocoa Touch 庫提供的類粗井。 盡管這些庫中的類與語言是分離的尔破,但是對他們的使用是與 Objective-C 編程緊密結(jié)合在一起的,并且很多 Objective-C 語言級別特性依賴于這些類提供的實現(xiàn)浇衬。
一個應(yīng)用架構(gòu)在對象的網(wǎng)絡(luò)之上
當你想要編寫一個 OS X 或 iOS 應(yīng)用呆瞻,你將花大部分的時間與對象打交道。這些對象是 Objective-C 類的實例径玖,其中一部分類是由 Cocoa 和 Cocoa Touch庫提供的痴脾,一部分需要你自己編寫。
編寫自己的類時梳星,你需要提供一份類的描述來給類的實例細化默認公開的接口赞赖。接口包含封裝相關(guān)數(shù)據(jù)的公開屬性,并包含一系列方法冤灾。方法聲明指出了一個對象可以接受的消息前域,并且指明了方法被調(diào)用時需要提供的參數(shù)。你還需要提供一份類的實現(xiàn)韵吨,用來提供在接口中聲明的每一個方法的可執(zhí)行代碼匿垄。
類別拓展已有的類
當你想給一個已有類添加并不復雜的行為,與其創(chuàng)造一個全新的類,還不如定義一個類別椿疗。你可以用類別給任何的類添加方法漏峰,包括你并不持有實現(xiàn)源代碼的類,比如框架類NSString
如果你擁有類的源代碼届榄,你可以用類拓展來添加新的屬性浅乔,或修改已有屬性的特性。類拓展經(jīng)常在單一源代碼或自定義庫的私有實現(xiàn)中被用于隱藏私有行為铝条。
協(xié)議定義消息協(xié)議
Objective-C 應(yīng)用的大部分工作都是由對象之間相互傳遞消息形成的靖苇。通常,這些消息是由類的接口中被明確聲明的方法來定義的班缰。但是有時候贤壁,如果能定義并不與某一特定類相關(guān)的一組相關(guān)的消息會很有用。
Objective-C 通過協(xié)議定義一組相關(guān)的方法埠忘,例如對象請求代理的方法脾拆,這些方法要么是可選的要么是必須的。任何類都可以表明它采用了協(xié)議给梅,這就意味著它必須提供協(xié)議中列出的必須實現(xiàn)的方法的實現(xiàn)假丧。
值和集合通常作為 Objective-C 的對象
在 Objective-C 中用 Cocoa 和 Cocoa Touch類來表示值很常見。NSString
類用于字符串的自負动羽, NSNumber
類用于不同的數(shù)字類型包帚,比如整數(shù)或浮點數(shù),NSValue
類用于其他值运吓,比如 C 結(jié)構(gòu)體渴邦。你也可以使用 C 語言定義的任何原始類型,比如 int, float, char
拘哨。
集合通常以集合類型的實例的形式存在谋梭, 用于收集其他 Objective-C 對象,比如NSArray, NSSet, NSDictionary
Blocks 簡化常規(guī)任務(wù)
Blocks 是一種被引入 C倦青,Objective-C 和 C++ 的一種語言特性瓮床,用來表示工作的一個單元;Block 囊括了一塊代碼以及這塊代碼被捕獲時的狀態(tài)产镐,這使得他們與其他編程語言中閉包的概念列斯隘庄。閉包通常被用于簡化常規(guī)任務(wù),如集合遍歷癣亚,分類和測試丑掺。Block使用如GCD這樣的技術(shù)也使得同步或異步作業(yè)的調(diào)度更加簡單。
錯誤對象被用于運行時錯誤
盡管 Objective-C 包含異常處理的語法述雾,但 Cocoa 和 Cocoa Touch僅在處理編程錯誤(如數(shù)組越界訪問)時使用異常處理街州,并且異常應(yīng)在應(yīng)用下次運行前被修復兼丰。
所有其他的錯誤,包括運行時錯誤比如存儲不夠或無網(wǎng)絡(luò)連接唆缴,可以被 NSError
的類實例來表示鳍征。為了在出錯時給用戶最好的用戶體驗,你的應(yīng)用應(yīng)該對錯誤有所準備并弄清如何處理最好琐谤。
Objectice-C 的代碼遵守已有的約定
當編寫 Objectice-C 代碼時蟆技,你應(yīng)該牢記一些已有的編程約定玩敏。 比如斗忌,方法名以小寫字母開頭,如果有多個單詞應(yīng)使用駝峰命名法旺聚;比如织阳, doSomething
or doSomethingElse
。并且砰粹,重要的不僅僅是大寫唧躲,你還應(yīng)該注意代碼的可讀性要好,這就意味著方法名表達性要好碱璃,但不至于太啰嗦弄痹。
除此之外,如果你想利用語言和框架的特性嵌器,還有一些要遵守的約定肛真。比如,屬性訪問方法必須嚴格的遵守命名約定以利用如 Key-Value Coding (KVC) 和 Key-Value Observing (KVO) 這樣的技術(shù)爽航。
先決條件
如果你是第一次接觸 OS X 或 iOS 開發(fā)蚓让,在閱讀本文檔之前,你應(yīng)該先閱讀一下 Start Developing iOS Apps Today 和 Start Developing Mac Apps Today 來對 iOS 和 OS X 應(yīng)用開發(fā)有一個整體的了解讥珍。除此之外历极,在嘗試大部分章節(jié)結(jié)尾的習題之前,你應(yīng)該先熟悉 Xcode 的使用衷佃。Xcode 是用來搭建 iOS 和 OS X 應(yīng)用的IDE趟卸。你將自己動手編寫代碼,搭建你應(yīng)用的交互界面氏义,測試你的應(yīng)用锄列,并且調(diào)試解決任何問題。
相關(guān)文獻
這個文檔中的內(nèi)容適用于 Xcode 4.4 及其之后的版本并假定你使用的是 OS X c10.7 及其之后的版本觅赊,或 iOS 6 及其之后的版本右蕊。獲取更多關(guān)于 Xcode 的信息,見 Xcode User Guide吮螺。獲取更多關(guān)于語言特性可利用性饶囚,見 Objective-C Feature Availability Index帕翻。
Objective-C 應(yīng)用使用引用計數(shù)來管理對象的生命周期。 大部分時候萝风,編譯器的自動引用計數(shù)特性會替你負責對象的內(nèi)存管理嘀掸。如果你無法利用 ARC, 或者你需要轉(zhuǎn)換或保留手動管理內(nèi)存的遺留代碼规惰,你應(yīng)該閱讀 Advanced Memory Management Programming Guide睬塌。
除了編譯器,Objective-C 還使用一個運行時系統(tǒng)來保證其動態(tài)性和面向?qū)ο筇匦孕颉km然你并不經(jīng)常需要考慮 Objective-C 是如何運作的揩晴,但還是有可能需要直接與這個運行時系統(tǒng)打交道,了解運行時贪磺,見 Objective-C Runtime Programming Guide and Objective-C Runtime Reference硫兰。