天天看點

《Effective Objective-C 2.0》1、熟悉Objective-C

該系列是《Effective Objective-C 2.0——編寫高品質iOS與OS X代碼的52個有效方法》的讀書筆記。

第一條:了解Objective-C語言的起源

同C++類似,Objective-C也是C語言進行面相對象化的擴充。二者存在一個根本性的差別:

C++是一種基于函數調用的語言,運作時執行的代碼由編譯器決定。某個對象試圖調用哪一個函數将在編譯過程中确定好。隻有在實作了多态函數的前提下,運作時才會按照虛函數表動态查找實際調用的函數。

Objective-C是一種基于消息結構的語言,運作時所執行的代碼由運作環境決定,在編譯時并不會查找目标對象要執行的方法。編譯器甚至不會實際關心接收消息的對象的類型,而是留到運作時由動态綁定進行處理。同C++相比,可以認為Objective-C永遠都是多态的。

也正是因為這種原因,Objective-C語言所有的重要工作都由運作時元件而非編譯器來實作,該元件包含了所有Objective-C面向對象特性所需的資料結構和函數。舉例說明,Objective-C編寫的應用大多運作在iOS作業系統上,Objective-C的運作時元件可以認為是屬于iOS的一部分。在查閱Objective-C文檔時我們也經常發現,某個類某個方法的有效範圍通常是給定的某幾個iOS的版本(如iOS 6.0以後、iOS 3.0~6.0等),而不是XCode 4.5、XCode 5.1等編譯工具的版本。這也說明Objective-C的函數更多的與iOS系統的版本相關聯而非IDE。

在Objective-C中,所有的對象都配置設定在堆空間中,不會直接配置設定在棧空間。對象建立後将對象的位址傳回一個指針用于對對象進行操作。另外有一些類比較特殊,已CGRect等為例,該類直接定義在棧中,已實力的形式存在而不是隻想對象的指針。因為CGRect等類實際上是C的結構體,而且結構較為簡單。采用這種方式有助于提升系統的性能。

第二條:盡量避免類的頭檔案中引入其他頭檔案

我們知道,在工程中建立一個Objective-C類,會添加頭檔案(.h)和源檔案(.m)兩個檔案。頭檔案中聲明類的公有成員和API接口,源檔案中實作類的方法。如果需要暴露的接口參數或公有成員為某一個Objective-C類,那麼可以使用前向聲明而非引入另一個類的頭檔案的方式解決:

如果直接引入頭檔案,那麼頭檔案所暴露給使用者的内容就會過多(尤其是連續很多級import之後),可能造成編譯時間較長。使用前向聲明則很好地解決了這個問題,減少了類的使用者的頭檔案的數量。而且解決了循環import可能造成的無法正确編譯的問題。

有時候必須在頭檔案中包含其他頭檔案,主要有兩種情況,其一是該類繼承自其他某個類,另一種情況是目前類複合某種協定,協定的定義應單獨放置于一個頭檔案中。而在代理(delegate)方法中,不需要添加獨立的頭檔案。代理方法與實作代理的類寫在同一個檔案中。

繼續閱讀