淺析OC語言,淺析oc
學習一門開發語言,首先要掌握的它的基本語法,這可能幾天就能學會,但如果要融會貫通,就得去學習這門語言的框架和一些庫,再結合一些項目的應用,這可能需要花幾年的時間。
OC是C語言的一個超集,是一門面向對象的語言,因為蘋果的崛起而火,API主要是cocoa(OSX)和cocoatouch(iOS),GCC 和 Clang 都能編譯OC,現在xcode使用的是Clang。
OC的實現是建立在運行時機制(runtime system)之上的(runtime system 使用C寫的),使它區別與C++編譯時機制,簡單來說就是OC代碼執行的時候需要結合runtime library,實現它的功能。正是因為如此,我們調用runtime的一些接口,動態地給OC的類添加方法,成員變量,交換兩個方法。這些是在C++無法實現的,C++的代碼執行,在編譯的時候就已經決定了。
OC的內存管理,在OC沒有像java那樣的GC機制,它使用的是引用計數機制,下面細說:
OC中定義一個對象: someClass *object = [[someClass alloc] init] ;
someClass *otherObject = object;
上面的代碼表示在堆(heap)裡面申請了一塊內存地址,用於存儲someClass的一個對象,然後在當前棧裡面分配兩個指針的內存大小,用來存儲兩個指向someClass內存地址的變量。棧裡面分配的內存,隨著棧被pop,內存自動釋放,而heap裡面,則是使用引用計數機制來管理,這種功能也是由runtime提供的,具體來說就是當有一個指針變量指向someClass對象在heap裡面的地址時,這個對象的count就是1,上面代碼中count就是2. 當這個對象的count變成0時,這個對象在堆中的內存就要被釋放了。
在OC中,實例對象只能存儲在堆中,像下面這種在棧中為對象分配內存,是不行的:
someClass objec = [[someClass alloc] init] ; 馬上就會有interface type cannot be statically allocated 的錯誤。
OC的引用計數機制分為手動引用計數(MRC)和自動引用技術(ARC),後者在2011年推出的,編譯器在編譯的時候自動的在代碼中添加retain和release,前者需要開發者自己添加,相當麻煩,一不留神,內存洩漏。
OC中所有的類都是繼承自NSObject,而且只能是單一繼承,而不能像C++那樣能多重繼承,這相對少了一些靈活性,但是OC提供了協議(protocol)彌補了這一缺陷。最近發布的swift,號稱面向協議的編程,更是把協議發揮到淋漓盡致(具體可以觀看wwdc視頻https://developer.apple.com/videos/play/wwdc2015-408/)面向接口編程,而不是面向實現編程,一直是我們追求的(扯到設計模式了)。因為OC與C的關聯,可以OC中,無縫使用C語法,OC還可以與C++組合成objective-c++,只需要把OC的.m文件改成.mm,編譯器馬上就可以識別為Objective-C++ source,所以可以在OC中使用C++的一些庫,極大方便開發。