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