爲何 Objective-C 很難

轉自:http://www.oschina.net/question/213217_41058程序員

做爲一個Objective-C的coder,我總能聽到一部分人在這門語言上抱怨有不少問題。他們總在想快速學習這門語言來寫一個App出來,但他們也老是聯想到Objective-C看上去實在太難了或者在想這些語法符號都是神馬玩意?不錯,他們問得很是好,因此本人也解釋一下爲何不少程序員相比較學習Ruby或者Java很容易,但在決定開發iOS或者OS X應用時會那麼猶豫。 

語法: 
首先咱們談談神馬叫作編程語言,編程語言是一種讓人們能讀懂而且可以展示程序的執行行爲的語言,包括語法(正確的表達式以及狀態機的使用規則)以及語義(如何去組織這些表達式以及狀態機以一種有意義的方式去完成咱們的目標) 

大部分編程語言都是基於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屬性,整個頭文件就這麼點東西: 

編程

1 @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。 

將來 : app

這4年來,咱們能夠看到Apple公司已經儘量的減少了Objective-C語言的大小以及複雜度。他們也完成了手動內存自動管理以及經典C頭文件的方式;並且開始慢慢對屬性存取器引入點語法以及Automatic Reference Counting來方便程序員編程。但就如今看來,Objective-C仍是比較難接觸與學習的;之因此如今變得愈來愈流行惟一的緣由就是它是作iOS app的惟一途徑了。框架

相關文章
相關標籤/搜索