之前一直學習的是java,javaweb,最近接觸的是安卓的開發,假期看了一些關於Objective-C的內容 ,由於家裡沒有網絡不能即時發布博文和大家分享了~
從之前學習的java語法到現在接觸的Objective-C有很多不同之處,例如:Objective-C沒有垃圾回收器,卻含有保留/釋放方法和自動釋放池。必要時,也可以在Objective-C程序中進行垃圾回收。
Java接口與Objective-C正式協議類似,因為都需要實現一組方法。Java具有抽象類,但Objective-C沒有。Java具有類變量,但Objective-C中,可以使用文件范圍內的全局變量並為它們提供對應的訪問器。Objective-C的公共和私有方法的形式比較松散。在Objective-C中,對象支持的任何方法都可以被調用,即使它們沒有以任何外部形式出現(例如頭文件中)。Java允許聲明final類,阻止更改其中的任何子類,而Objective-C則與此相反,允許在運行時向任何類添加方法。
Objective-C中類的實現方式可以分成兩個文件,頭文件和自身的實現文件。但並不是一定要這樣劃分(例如某些小的私有類),這在本書的某些代碼中意境有所反映。頭文件(帶有.h擴展名)保留類的公開信息,例如使用此類的代碼講使用的任何新的枚舉、類型、結構,以及代碼。其他代碼段使用預處理器(#import)導入該文件。Java中缺少C預處理器。C預處理器是一種文本替換工具,它能在C、Objective-C和C++源代碼進行編譯器之前,先對它們進行自動處理,以#開頭的指令表示一個預處理器命令。C預處理器是一個功能非常強大但又危險的工具。很多編程人員都認為java中缺少預處理器是一個良好的特性。
在java中,幾乎所有錯誤都是通過一場來處理的。而在Objcective-C中,錯誤處理的方式取決於所使用的API。Unix API通常會返回值-1和一個全局錯誤編號(error),以設置某個特定的錯誤,Cocoa API通常僅在編程人員出現或無法清除時才拋出異常。Objective-C語言提供的異常處理特性與java及C++類似,采用@try、@catch、和@finally結構。
在Objective-C中,空(零)對象采用nil表示,可以向nil對象發送消息,而不必擔心出現NullPointerException異常。向nil對象發送的消息代表停止操作指令,因此,不必檢查發送的消息是否為NULL。
在Objective-C中,通過使用類別向現有類中添加方法,可以改變類的行為。 Objective-C中沒有類似於final的類。因為編譯器需要知道超類定義的對象的大小,所以任何類只要包含子類頭文件,就可以把它設置為子類。
實際上,相對於java而言,在Objective-C中很少使用子類化行為。因為,通過類別和動態運行時機制,可以想任何對象發送任何消息,可以將某些功能放到含有較少功能的類中,也可以將功能呢放到最有意義的類中。例如:可以在NSString上加入類別來添加反轉字符串或刪除所有空格等特征,然後可以在任何NSString類中調用該方法,無論調用來自何處。當然,你也可以使用自己的字符串子類來提供那些特性。
一般來說,只有當創建某個全新的對象(位於對象層次結構的頂部),或者需要從根本上改變某個對象的行為,或者由於類不能實現某個功能而需要使用子類時,才需要在Cocoa中設置子類,例如:Cocoa使用NSView類機構用戶界面組件,卻無法實現它的dramRect:方法。因此,需要試這NSView的子類並重寫dramRect:方法來繪制視圖。但對其他大多數對象,通常采用委托和數據源的方式。由於Objective-C可以想任何對象發送任何消息,對象不必含有特定的子類或遵從特定的接口,這樣,單個類就可以成為任意個不同對象的委托和數據源。
因為類別中意境聲明了數據源和委托方法,因此,不必實現所有的數據源和委托方法,在Objective-C中,Cocoa編程很少使用空存根方法,某些方法會在嵌入式對象中調用相同的方法來使編譯器能夠順利底適應一種正式協議。
當然,功能越強,責任越大。Objective-C采用手動保留、釋放和自動釋放的內存管理系統,這樣容易產生一些棘手的內存錯誤,在其他類中添加類別是一種功能強大的工作機制,但如果隨意濫用,會降低代碼的可讀性,導致其他人無法理解。另外,Objective-C是以C為基礎的,因此,可以使用C語言的所有特性,同事包括使用預處理器可能帶來的危險,並可能出現與指針相關的內存管理錯誤。