本節書摘來自華章出版社《編寫高品質代碼:改善objective-c程式的61個建議》一 書中的第2章,作者:劉一道,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
在衆多武俠小說描述的武林界,國術泰鬥張三豐,雖然師從少林覺遠和尚,但是真人張三豐人集百家之長,融道家養身,剛柔相濟,動靜結合,以柔克剛,以靜制動,而獨創武當派。objective-c和c語言的關系正如“武當和少林”的關系一樣,兩者雖有關系,但并非是繼承關系,故稱objective-c是c語言的超集。
objective-c 作為 c 程式設計語言的超集,支援與 c 相同的基本文法。會看到所有熟悉的元素,如基本類型(int、float 等)、結構、函數、指針,以及流程控制結構,如 if...else 語句和 for 語句。還可以通路标準 c 庫例程,如在 stdlib.h 和 stdio.h 中聲明的那些例程。
(1)c語言中每個标準變量類型在objective-c中都可用,例如:
(2)c語言中的标準運算符在objective-c中可用,例如:
(3)可用标量來表示objective-c的屬性,例如:
(4)通過點文法通路值時,可以在屬性中使用c操作符,例如:
點文法純粹是對存取方法調用的一個文法包裝,是以在這個例子中的每個操作相當于先使用get通路器方法來擷取值,然後執行操作,最後使用set通路器方法來把該值設定為結果。
(5)在objective-c中,定義了新的基本資料類型。bool标量類型在objective-c中仍然被定義布爾值,其值表示為yes或no。正如所料,yes邏輯上等同于true和1,而no等同于false和0。在cocoa和cocoa touch對象中方法中的許多參數,也可以使用特殊的标量數值類型,如 nsinteger 或 cgfloat。例如,如前一章所述,nstableviewdatasource uitableviewdatasource協定都有方法要求要顯示的行數:
這些類型,如 nsinteger 和 nsuinteger,類型不同的定義,這取決于目标架構。在32 位環境(如 ios)生成時,它們是32位有符号和無符号整數;在64位環境 (如現代 os x 運作時)時,它們是64位有符号和無符号整數。
如果要作可跨api邊界(包括内部和導出的api)的應用,它的最佳實踐是使用這些平台特定的類型,如應用代碼和架構之間的方法或者函數調用的參數或傳回值。
對于局部變量,如在一個循環計數器中,如果知道該值是标準限值内,使用基本的c類型是很好的。
(6)c語言中的資料結構在objective-c中可保持其基本值。在一些cocoa和cocoa touch api中,仍然使用c語言結構來儲存它們的值。作為一個例子,它可能要向一個字元串對象來查詢子串的範圍,例如:
同樣,如果需要編寫自定義的繪圖代碼,需要根據cgfloat相關的資料類型結構,與quartz進行互動,如os x 上的 nspoint 和cgpoint,ios 上的 nssize 和 cgsize。再次,cgfloat會在不同的目标結構以不同方式來定義。
(7)objective-c值對象比c 類型變量具有封裝常用操作的優勢。在objective-c代碼中,複制值對象,表示屬性的對象,是一種很普遍的做法。c-類型的變量通常可以取代值對象,但值對象具有封裝常用操作的優勢。例如,nsstring對象被用來代替字元指針,因為它們封裝了編碼和存儲。
當值對象作為方法的參數被傳遞或者從一個方法被傳回時,通常會使用對象的副本,而不是對象本身。例如,下面的方法将一個字元串指派給對象的name執行個體變量。
存儲aname的一個副本,其效果是産生一個獨立于原始對象,但與原始對象具有相同内容的對象。副本的後續變化不會影響原始對象,并且原始對象的變化也不會影響副本。類似的,一種常見的做法是傳回執行個體變量的副本,而不是執行個體變量本身。例如,下面的方法傳回name執行個體變量的一個副本:
要點
(1)c語言的基本文法在objective-c語言中是可用的。
(2)與c語言相比,objective-c語言又定義了新的基本資料類型,如bool等。
(3)objective-c值對象比c 類型變量具有封裝常用操作的優勢,但在數值計算中,使用c類型标量更為簡潔。