《Effective Objective-C 2.0》1、熟悉Objective-C
該系列是《Effective Objective-C 2.0——編寫高質(zhì)量iOS與OS X代碼的52個(gè)有效方法》的讀書筆記。
第一條:了解Objective-C語言的起源
同C++類似,Objective-C也是C語言進(jìn)行面相對(duì)象化的擴(kuò)展。二者存在一個(gè)根本性的區(qū)別:
- C++是一種基于函數(shù)調(diào)用的語言,運(yùn)行時(shí)執(zhí)行的代碼由編譯器決定。某個(gè)對(duì)象試圖調(diào)用哪一個(gè)函數(shù)將在編譯過程中確定好。只有在實(shí)現(xiàn)了多態(tài)函數(shù)的前提下,運(yùn)行時(shí)才會(huì)按照虛函數(shù)表動(dòng)態(tài)查找實(shí)際調(diào)用的函數(shù)。
- Objective-C是一種基于消息結(jié)構(gòu)的語言,運(yùn)行時(shí)所執(zhí)行的代碼由運(yùn)行環(huán)境決定,在編譯時(shí)并不會(huì)查找目標(biāo)對(duì)象要執(zhí)行的方法。編譯器甚至不會(huì)實(shí)際關(guān)心接收消息的對(duì)象的類型,而是留到運(yùn)行時(shí)由動(dòng)態(tài)綁定進(jìn)行處理。同C++相比,可以認(rèn)為Objective-C永遠(yuǎn)都是多態(tài)的。
也正是因?yàn)檫@種原因,Objective-C語言所有的重要工作都由運(yùn)行時(shí)組件而非編譯器來實(shí)現(xiàn),該組件包含了所有Objective-C面向?qū)ο筇匦运璧臄?shù)據(jù)結(jié)構(gòu)和函數(shù)。舉例說明,Objective-C編寫的應(yīng)用大多運(yùn)行在iOS操作系統(tǒng)上,Objective-C的運(yùn)行時(shí)組件可以認(rèn)為是屬于iOS的一部分。在查閱Objective-C文檔時(shí)我們也經(jīng)常發(fā)現(xiàn),某個(gè)類某個(gè)方法的有效范圍通常是給定的某幾個(gè)iOS的版本(如iOS 6.0以后、iOS 3.0~6.0等),而不是XCode 4.5、XCode 5.1等編譯工具的版本。這也說明Objective-C的函數(shù)更多的與iOS系統(tǒng)的版本相關(guān)聯(lián)而非IDE。
在Objective-C中,所有的對(duì)象都分配在堆空間中,不會(huì)直接分配在棧空間。對(duì)象創(chuàng)建后將對(duì)象的地址返回一個(gè)指針用于對(duì)對(duì)象進(jìn)行操作。另外有一些類比較特殊,已CGRect等為例,該類直接定義在棧中,已實(shí)力的形式存在而不是只想對(duì)象的指針。因?yàn)镃GRect等類實(shí)際上是C的結(jié)構(gòu)體,而且結(jié)構(gòu)較為簡(jiǎn)單。采用這種方式有助于提升系統(tǒng)的性能。
第二條:盡量避免類的頭文件中引入其他頭文件
我們知道,在工程中新建一個(gè)Objective-C類,會(huì)添加頭文件(.h)和源文件(.m)兩個(gè)文件。頭文件中聲明類的公有成員和API接口,源文件中實(shí)現(xiàn)類的方法。如果需要暴露的接口參數(shù)或公有成員為某一個(gè)Objective-C類,那么可以使用前向聲明而非引入另一個(gè)類的頭文件的方式解決:
@class SomeClassName;如果直接引入頭文件,那么頭文件所暴露給使用者的內(nèi)容就會(huì)過多(尤其是連續(xù)很多級(jí)import之后),可能造成編譯時(shí)間較長。使用前向聲明則很好地解決了這個(gè)問題,減少了類的使用者的頭文件的數(shù)量。而且解決了循環(huán)import可能造成的無法正確編譯的問題。
有時(shí)候必須在頭文件中包含其他頭文件,主要有兩種情況,其一是該類繼承自其他某個(gè)類,另一種情況是當(dāng)前類復(fù)合某種協(xié)議,協(xié)議的定義應(yīng)單獨(dú)放置于一個(gè)頭文件中。而在代理(delegate)方法中,不需要添加獨(dú)立的頭文件。代理方法與實(shí)現(xiàn)代理的類寫在同一個(gè)文件中。
總結(jié)
以上是生活随笔為你收集整理的《Effective Objective-C 2.0》1、熟悉Objective-C的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用canvas实现擦玻璃效果
- 下一篇: 优化表的数据类型