這里介紹一些特性,在編寫Objective-C程序時不一定需要了解。
事實上,這些大部分來源于相關聯的基本的C語言特性,
雖然C語言是一門過程式語言,其中的一些特性與面向對象編程的思想是對立的,
但是語言是思想也是工具,在其中找到二者關聯和差異,會對Objective-C有更深入的理解。
#### 數組:
定義一組有序的數據項,即數組。
如果在字符數組結尾添加一個終止空字符(‘\0’),就產生了一個通常稱為字符串的變量。
和其他變量類型一樣,必須在使用之前先聲明數組,
數組的聲明涉及聲明數組所包含元素的數值類型,以及將存儲在數組中的最大元素數目。
#### 函數:
如果使用了自動引用計數(ARC),那么每次調用函數(方法)時,局部對象的變量都會默認初始化為空。
在函數中(和在方法中一樣)定義的變量稱為自動局部變量。
因為每次調用該函數后,它們都自動“創建”,并且它們的值對于函數來說是局部的。
函數和方法:函數是指非對象的過程調用,方法是指對象的過程調用。
函數默認的返回類型與方法默認的不同。
如果沒有為方法指定返回類型,編譯器就會假設它返回id類型的值。
同樣,應該為方法聲明返回類型,不要依賴這個事實。
函數的默認返回值是整型值。
調用函數或方法時,作為參數傳遞的值將被復制到相應的形參中。
使用數組時,并非將整個數組的內容復制到形參數組中,
而是傳遞一個指針,它表示數組所在的計算機內存地址。
所以,對形參數組所作的所有更改實際上都是對原始數組而不是數組的副本執行的。
因此,函數或方法返回時,這些變化仍然有效。
塊Blocks:
塊對于c語言是一種擴展。
它并沒有作為標準ANSI C所定義的部分,而是APPLE公司添加到語言中的。塊
看起來更像是函數。
一般來說,塊是不能改變外部的變量的,除非使用_ _block int num = 0;這樣修飾的變量。
塊的其中一個優勢在于能夠讓系統分配給其它處理器或應用的其它線程執行。
簡言之:線程安全的。
**不建議使用,不是標準的東西,當對程序進行移植時,就會顯現出很不方便。**
指針:
C語言里的重要特性,面試必考,工作必用。
指針可以高效地表示復雜的數據結構,更改作為參數傳遞給函數和方法的值,
并且能更準確、高效的處理數組。
字符串常量:
“This is char.” 這個是C樣式的字符串。它們不是對象。
@“This is char.”這個是面向對象的字符串對象。
while循環用到了空字符等于數值0這一事實,熟練的Objective-C編程人員經常這樣使用。
~~~
char *from;
char *to;
while (*from)
*to++ = *from++;
*to = '\0';
~~~
函數指針:
1)常見應用之一是作為參數傳遞給其它函數。
2)常見應用之一是建立分派表。即函數列表。
上面這些C語言特性,要記住一個基本原則:它們都不是對象。
這意味著不能給它們傳遞消息,也不能利用它們獲得Foundation框架提供的內存分配策略之類的最大優勢。
其他語言特性:
符合字面量:
`(struct data) {.month = 7, .day = 2, .year = 2011}`
#### goto語句:
懶惰的程序員才會經常濫用goto語句,goto語句的執行導致在程序中產生一個到達特定點的直接分支。
如果你不懶惰,建議你還是不要經常使用該語句。
#### 空語句:
不做任何操作。
逗號運算符:
優先級列表里最底層的運算符,
在Objective-C語言中,所有的運算符都產生一個值,
所以逗號運算符的值是最右邊的表達式值。
sizeof運算符:
Objective-C語言提供了sizeof運算符,
它可以用來確定數據類型或對象的大小,返回的是指定項的字節大小。
#### 工作原理:
關于Objective-C語言和C語言聯系的4個事實。
1)實例變量存儲在結構中。
定義一個類和它的實例變量時,這些實例變量實際上存儲在一個結構中。
這說明了如何處理對象,對象實際上是結構,結構中的成員是實例變量。
所以繼承的實例變量加上你在類中添加的變量就組成了一個結構。
使用alloc分配新對象時,系統預留了足夠的空間來存儲這些結構。
結構中繼承的成員(從根對象中獲得的)之一是名為isa的保護成員,它確定對象所屬的類。
2)對象變量實際上是指針。
來創建新的實例時,是在為對象的新實例分配存儲空間(即存放結構的空間),然后使用結構的指針,并將指針變量存儲在其中。
3)方法是函數,而消息表達式是函數調用。
方法實際上是函數。調用方法時,是在調用與接收者類相關的函數。
傳遞給函數的參數接收者(self)和方法的參數。
Objective-C編譯器通過類名稱和方法名稱的組合為每個函數產生一個唯一的名稱。
4)id類型是通用指針類型。
返回id類型值的方法只是返回指向內存中某對象的指針。
在C語言中就是 void *。
看了這4個事實后,你就會發現,其實,這些事實只是透露出Objective-C的面向對象底層是如何實現的。
基本上所有的面向對象都是使用面向過程的一個擴展來實現的,C++也是這樣的。
也就是說,對象這個東西的底層實現都是由過程完成的。
簡而言之:
對象都是結構struct和指針的組合而已。
看到很多面向對象的語言編譯時都是轉換為C語言的結構和指針,使用C語言編譯。
說明面向對象的底層實現都是差不多的。
所以,從技術實現上來講,沒有特別大的變革。
但是從概念或思想上來說,這是巨大的。
另外,那些像perl,python等等這些解釋執行的語言,最后的實現也是C語言來完成的。
語言是工具,但同樣蘊涵著一種哲理,或是一種思想的表達。
語法或細節什么的忘記了可以再查看,理解了思想,你才能說對這門語言有所了解。