Objective-C
布萊德·考克斯發明的編程語言
Objective-C,通常寫作ObjC或OC和較少用的Objective C或Obj-C,是擴充C的面向對象編程語言。它主要使用於Mac OS X和GNUstep這兩個使用OpenStep標準的系統,而在NeXTSTEP和OpenStep中它更是基本語言。
GCC與Clang含Objective-C的編譯器,Objective-C可以在GCC以及Clang運作的系統上編譯。
1980年代初布萊德·考克斯(Brad Cox)在其公司Stepstone發明Objective-C。他對軟體設計和編程里的真實可用度問題十分關心。Objective-C最主要的描述是他1986年出版的書 Object Oriented Programming: An Evolutionary Approach. Addison Wesley. ISBN 0-201-54834-8.
Objective-C是編寫以下應用的利器:
• iOS操作系統
• iOS應用程序
• Mac OS X操作系統
• Mac OSX 上的應用程序
Objective-C是非常實用的語言。它是一個用C寫成很小的運行庫,令應用程序的尺寸增加很小,和大部分OO系統使用極大的VM執行時間會取代了整個系統的運作相反。Objective-C寫成的程序通常不會比其原始碼大很多。而其函式庫(通常沒附在軟體發行本)亦和Smalltalk系統要使用極大的內存來開啟一個窗口的情況相反。因此,Objective-C它完全兼容標準C語言(C++對C語言的兼容僅在於大部分語法上,而在ABI(Application Binary Interface)上,還需要使用extern "C"這種顯式聲明來與C函數進行兼容),而在此基礎上增加了面向對象編程語言的特性以及Smalltalk消息機制。
Objective-C的最初版本並不支持垃圾回收。在當時這是爭論的焦點之一,很多人考慮到Smalltalk回收時有漫長的死亡時間,令整個系統失去功用。Objective-C為避免此問題才不擁有這個功能。雖然某些第三方版本已加入這個功能(尤是GNUstep), Apple在其Mac OS X 10.3中仍未引入這個功能。
雖然Objective-C是C的超集,但它不是C的基本類型為第一級的對象。
Objective-C同C++的異同:
和C++不同,Objective-C不支持運運算元重載(它不支持ad-hoc多型)。亦與C++不同,但和Java相同,Objective-C只容許對象繼承一個類別(不設多重繼承)。Categories和protocols不但可以提供很多多重繼承的好處,而且沒有很多缺點,例如額外執行時間過重和二進位不兼容。
Objective-C和C++的比較
單一繼承:
和Java、Smalltalk一樣,Objective-C不支持多重繼承,而C++語言支持多重繼承。
動態:
Objective-C是動態定型(dynamicaly typed),它的類庫比C++容易操作。Objective-C 在運行時可以允許根據字元串名字來訪問方法和類,還可以動態連接和添加類。
C++ 跟從面向對象編程里的Simula 67(一種早期OO語言)學派,而Objecive-C屬於Smalltalk學派。
在C++里,對象的靜態類型決定你是否可以發送消息給它,而對Objective-C來說,由動態類型來決定。Simula 67學派更安全,因為大部分錯誤可以在編譯時查出。而Smalltalk學派更靈活,比如一些Smalltalk 看來無誤的程序拿到Simualr67那裡就無法通過。
從很多方面來看,C++和Objective-C的差別,與其說是技術上的,不如說是思維方式上的。你是否想更安全而捨棄靈活性?Simular67學派的支持者稱既然程序設計出色何必再要靈活性,而 Smalltalk學派則稱為了靈活可以容忍運行時多出錯。
Apple在其Mac OS X 10.3中仍未引入垃圾回收這個功能。不過令人欣慰的是在Apple發布的Xcode4中已經支持自動釋放(不等同於嚴格意義上的垃圾回收,因為兩者機制不同)。在Xcode4中的自動釋放,也就是ARC(Automatic Reference Counting)機制,不需要用戶手動去Release一個對象,而是在編譯期間,編譯器會自動幫你添加[NSObject release]。
另一個問題是Objective-C不包括命名空間機制(namespace mechanism),取而代之的是程序設計師必須在其類別名稱加上前綴,時常引起衝突。在2004年,在Cocoa編程環境中,所有Mac OS X類和函數均有“NS”作為前綴,例如NSObject或NSButton,以表明它們屬於Mac OS X核心(使用“NS”是由於這些類和函數在NeXTSTEP開發時定下的)。
雖然Objective-C是C的超集,但它不視C的基本型為第一級的對象。
由於Objective-C使用動態運行時類型,而且所有的方法都是函數調用(有時甚至連繫統調用(syscalls)也如此),很多常見的編譯時性能優化技術失效(例如:內聯函數、常數傳播、互動式優化、純量取代與聚集等)。這使得Objetive-C性能劣於類似的對象抽象語言(如C++)。不過Objective-C擁護者認為既然Objective-C運行時消耗較大,Objective-C本來就不應應用於C++或Java常見的底層抽象。
蘋果公司一直在嘗試降低Objective-C語言的複雜度 --淘汰手動內存管理以及C標準頭文件,引入更符合當下編程語言潮流的ARC機制,還有通過。語法來訪問屬性的getter/setter方法等等,都是為了降低Objective-C的學習難度。即便如此,學習Objective-C仍然需要克服學習門檻。它的熱度完全是由基於Objective-C編寫的熱門iOS應用帶起來。
2010年5月
本期主要變化是Objective-C排名進入前十。儘管Objective-C的份額在上個月只達到0.08%,但卻在排名上邁出了重要一步——首次進入前十名。這一步的意義重大,要知道,2001年6月TIOBE編程榜發布以來,總體只有13個編程語言曾經進入前十名。
Objective-C流行的主要原因可能是它是唯一一種可以為iPhone和iPad編程的語言。但單從編程語言的角度來看,誕生於1986年的Object-c並沒有表現出多少新意。
2011年6月
Objective-C排名繼續爬升,從第10名上升到第7名,增長2.07%,是前二十名中增幅最大的。由此可見,Objective-C具有很大的發展空間。
2011年7月
本期的榜單標題: Objective-C將成為年度語言。Objective-C名列第6名。
2011年8月
Objective-C繼續強勁上升,有可能在2011年超過C#和PHP。
2011年11月
Objective-C保持在第6位,距離第5位的PHP僅有0.113%的差距,且保持上升趨勢,而PHP呈現下降趨勢,很可能在2011年會超越PHP升至第5位。
2011年12月
Objective-C在本期中又上升至第5位.
2012年1月
前三的位置有變動,第三位置已經易主,由上一期的C++變為了C#,不過Objective-C 在連續兩年獲得第二名之後,終於贏得了 TIOBE 2011 年度編程語言。
2012年7月
Objective-C升至第3位,壓倒了之前的C++,市場份額佔到9.335%。
2012年8月
Objective-C繼續上升,隨著JAVA的下降,Objective-C存在超越JAVA的勢頭。
2012年9月
Objective-C繼續上升至第三位,但其與前兩名的差距還有很大,由此可見,未來很長一段時間內,還沒有語言能夠撼動C和Java的地位。
2012年10月
Objective-C繼續上升,增加了3.23個百分點,市場份額達到9.477%。
Objective-C躥升勢頭良好,增加了4.40個百分點,市場份額達到17.455%。
2012年12月
Object-C繼續停留在第三位,增加了4.31%個百分點,增長速度傲視群雄。市場份額達到11.116%,相比其他語言Object-C的增長速度非常快。
2013年1月
2013年1月編程語言排行榜榜單
2013年2月
TIOBE 公布了2013年2月TIOBE 編程語言指數排行榜。此次前三位置有變化,Java 重回第一,C 降至第二,Objective-C 還是第三。
2013年3月
2013年3月12日,Tiobe公布了新一期編程語言排行榜。Java依舊是佔據第一的位置,C語言緊隨其後。值得注意的Objective-C持續發力,已經佔到了第三的位置。咋一看榜單,前5條中C#下滑最快,從第3名下降到第五名。而其他語言都與之前沒有變化。
2013年4月
2013年4月TIOBE編程語言排行榜發布了!4月份最主要的變化是 C 語言超越 Java 又居第一,而 C++ 超過 Objective-C 位列第三。
2013年5月
2013年5月TIOBE編程語言排行榜發布!C語言漲勢迅猛,依然佔據著榜首的位置;Java、C++略有下滑,又由於Objective-C的反彈,本來差距不大的C++與Objective-C再度易位!
2013年8月
在2013年8月排行中,TIOBE增加了16個新的搜索引擎后,C和Objective-C成為最大的受害者,它們呈大幅下降趨勢,分別下降了1.65% 和2.17%;而Go 語言則從42 名提升到26 名。LabVIEW者從100提升到49名,Openedge ABL從129名提升到57名。而Java又重新回到了自己的寶座。
關於hello world的更多擴展內容
在 Objective-C 中 #import 和 #include 的區別
在 Objective-C 中,#import 被當成 #include 指令的改良版本來使用。除此之外,#import 確定一個文 件只能被導入一次,這使你在遞歸包含中不會出現問題。使用哪一個還是由你來決定。一般來說,在導入 Objective-C 頭文件的時候使用 #import,包含 C 頭文件時使用 #include。
未來發展
2010年的4月,TIOBE世界編程語言排行榜的前20名。Objective-C則從第8一路飆升,超越了C#,佔據了第4的位置。
2012年的7月,Objective-C首度超越了C++,取代C++成為排行榜的第3位,成為新科探花。
2013年的1月,Objective-C 連續第 2 年獲得“年度語言”殊榮。年度語言是指在上一年份額增長最多的語言。Objective-C 最新的份額為 10.283%,比去年同期增長了 3.37%。