標籤:
轉自:http://mobile.51cto.com/hot-322261.htm 2012-03-07 13:43 junwong 開源中國社區 字型大小:T | T
作為一個Objective-C的coder,我總能聽到一部分人在這門語言上抱怨有很多問題。他們總在想快速學習這門語言來寫一個App出來,但他們也總是聯想到Objective-C看上去實在太難了或者在想這些文法符號都是神馬玩意?不錯,他們問得非常好,所以本人也解釋一下為什麼很多程式員相比較學習Ruby或者Java很容易,但在決定開發iOS或者OS X應用時會那麼猶豫。
AD:乾貨來了,不要等!WOT2015 北京站演講PPT開放下載!
文法:
首先我們談談神馬叫做程式設計語言,程式設計語言是一種讓人們能讀懂並且能夠展現程式的執行行為的語言,包括文法(正確的運算式以及狀態機器的使用規則)以及語義(如何去組織這些運算式以及狀態機器以一種有意義的方式去完成我們的目標)
大部分程式設計語言都是基於C文法風格的,也就是我們常說的點文法,依靠小數點符號來調用方法或者擷取類的成員(當然了,在C語言中類被替代為結構體)。它們通常都是自己實作類別的定義(注意在這裡Java與C#和 C++有稍微一點不一樣),但無論如何這些語言的具體細節都是一樣的。當我們接觸一個新的程式設計語言時,我們當然很樂意看到新語言的文法是我們似曾相識的。畢竟大部分程式員都瞭解C語言的文法。
然而Objective-C壓根就不是C文法風格的程式設計語言。它與我們熟悉的語言文法區別太大以至於大部分程式員根本看不懂這些Objective-C代碼是神馬東西。
甚至其他一些像Python或者Ruby這樣的“奇怪”的語言都能讓人看個大概出來,畢竟Python與Ruby至少還是點文法風格的,使用點文法來調用方法以及擷取類的成員。相反它們缺乏分支結構並不會長時間影響程式員的理解,畢竟這兩種語言也有自己的方式來完成同樣的目標。
下面我們來介紹一下Objective-C語言: 這裡我會拿另一個OOP語言來與它進行比較
我想這裡大家肯定還不會有什麼問題,來看看這個:
好了好了,我想肯定有部分人想問一大堆問題了。但這還不是最糟糕的,我們接著來看一個更強悍的:
一般到了這裡,我想大家都頭都大了幾圈。
這到底是個神馬情形?這麼多分號!太恐怖了!接著會冒出一大堆問題:這到底調用的是神馬方法?又是怎麼調用的?是performAction嗎還是別的東西?方法重載該如何做?哦,我的天!
最好先忘了我們熟悉的方法調用。實際上,當你看到performAction:withTwoParameters:時,我們其實在談論訊息而不是方法。當你能這麼理解時問題就好辦多了。
實際上Objective-C是很嚴格的C語言的超集。而與流行的程式設計語言風格又差距太大。作為C語言的超集,它增加了很多東西,我們將簡單看看它到底增加了什麼複雜的東西。
Objective-C是一個很“大”的語言,我是說它的文法很複雜而且又具備彈性。Apple公司已經儘可能減小了Objective-C語言的體積,然而,他們還是添加了一些東西來讓Objecive-C運算式更加簡單。
- Synthesizing properties
- Dot-syntax for accessing getters/setters
- Garbage Collection
- Blocks (closures)
- Automatic Reference Counting
- Weak references
所以雖然這個語言越來越大了,但是在表達同樣的目的使用的代碼卻越來越簡單。
運行時:
Objective-C的運行時是動態,它能讓你在運行時為類添加方法或者去除方法以及使用反射。
除非你用過像Ruby或者Lisp這類支援這種特性的語言,否則你會感覺很怪異。但請放心!在你嘗試使用一些好的新特性時一開始都是很鬱悶的。
架構:
如果離開了Cocoa/Cocoa Touch架構,那麼Objective-C簡直沒法建立App。就如同Ruby離開了Rails就沒法建立Web應用程式一樣。
Cocoa既大又老。比如看看UIView的contentStretch屬性,整個標頭檔就這麼點東西:
- @property(nonatomic) CGRect contentStretch __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- // animatable. default is unit rectangle {{0,0} {1,1}}
就這麼多?首先我假定它定義了一個可展開的內容地區,但是這是如何做到的?矩形單元又在哪裡?Cocoa/Cocoa-Touch是解釋這個的唯一途徑,作為Objective-C的新人,你可以去諮詢它。
曆史:
縱向看來,Apple公司領導著Objective-C語言的發展與維護,包括Objective-C運行時,Cocoa/Cocoa-Touch架構以及Objective-C語言的編譯器。看上去Objective-C就如同以下一個雲狀圖:
當你去學習Objective-C時,它不僅僅就是一個架構,一個運行時或者一個編譯器;而是它們全部。還有個很重要的組件就是 Automatic Reference Counting(使用後無法直接調用dealloc方法),這玩意會讓你使用Cocoa/Cocoa-Touch編程時更加方便。
緊密耦合系統代碼設計是Objective-C專屬的。其他語言比如在.Net架構下啟動並執行Iron Python。以及一大堆運行在JVM的非Java語言,比如Clojure。甚至Ruby以及Rails都是兩個不同的項目。當你打算使用其他語言配合 Cocoa/Cocoa-Touch以及Objective-C運行時時。你唯一的選擇就是Mac Ruby。
未來 :
這4年來,我們可以看到Apple公司已經儘可能的減小了Objective-C語言的大小以及複雜度。他們也完成了手動記憶體自動管理以及經典C標頭檔的方式;而且開始慢慢對屬性存取器引入點文法以及 Automatic Reference Counting來方便程式員編程。但就現在看來,Objective-C還是比較難接觸與學習的;之所以現在變得越來越流行唯一的原因就是它是做iOS app的唯一途徑了。
【責任編輯:立方 TEL:(010)68476606】
為什麼Objective-C很難