1. 命令行下編譯
可使用名爲gcc的GNU Objective-C編譯器來編譯並連接這個程序,gcc命令通常的格式爲:
gcc -framework Foundation files -o progname
該選項說明你要使用有關Foundation框架的信息:
-framework Foundation
2. 語法
Objective-C是區分大小寫的
Obj-C採用特定的語法對類和實例應用方法:[ClassOrInstance Method]
在這條語句中,左方括號要緊跟類的名稱或該類的實例的名稱,它後面能夠是一個或者多個空格,空格後面是將要執行的方法。請求一個類或者實例來執行某個操做時,就是在向它發送一條消息。所以也能夠表示爲:
[receiver message]
@interface定義的方法中,開頭的負號(-)通知Obj-C編譯器,該方法是一個實例方法。其餘惟一的選擇是正號(+) 。類方法是對類自己執行某些操做的方法。
Apple的運行時系統提供了一個稱爲垃圾回收的機制,它可自動清理內存。可是,最好要學會如何本身管理內存的使用,而不是依賴於自動的機制。事實上,針對不支持垃圾回收的某些平臺,如iphone進行程序設計時,就不能依賴與垃圾回收機制。
使用@property和@synthesize來自動生成設置函數方法和獲取函數方法。
關鍵字self用來指明對象是當前方法的接收者。相似c++的this
@class,使用@class關鍵字聲明一個類,提升了效率,由於編譯器不須要處理整個類.h文件;而只須要xxx是個類名字。若是須要引用xxx類中的方法,@class指令是不夠的,由於編譯器須要更多的信息。須要知道該方法中有多少參數,它們是什麼類型,方法的返回類型是什麼。
關鍵字super,用來引用消息接收者的父類。
@selector(alloc) 爲名爲alloc的方法聲稱一個SEL類型的值。要肯定對象是否能夠響應這個動做,可使用respondsToSelector。
@try, @catch(NSException), @throw, @finally [exception name] [exception reason]
接口中能夠聲明@protected(這個指令後面的實例變量可被該類及任何子類中定義的方法直接訪問,這是默認的狀況); @private (可被定義的類的方法直接訪問,可是不能被子類中定義的方法直接訪問);@public(可被該類定義的方法直接訪問,也可被其餘類或模塊中定義的方法直接訪問,使得其餘方法或函數能夠經過使用指針運算符->訪問實例變量);@package(對於64位圖像,能夠在實現該類的圖像的任何地方訪問這個實例變量)
3. 繼承
有時,建立類只是使建立子類更容易。所以,這些類名爲抽象類。例如Foundation的NSNumber類是爲了將數字做爲對象處理而建立的抽象類。整數和浮點數字一般有不一樣的內存需求。每種數字類型都有單獨的NSNumber子類。由於這些子類屬於NSNumber類,總起來名爲簇(cluster)。向NSNumber類發送消息來建立新的整數對象時,使用合適的子類爲整數對象分配必需的空間,並正確的設定其值。這些子類其實是私有的。你本身沒法直接訪問這些子類,只能經過抽象的超類間接訪問。
4. Category
分類(Category)提供了一個方式,用它能夠將類的定義模塊化到相關方法的組或者分類中。它還提供了擴展示有類定義的簡便方式,而且沒必要訪問類的源代碼,也無需建立子類。
關於分類有幾點值得注意,首先,儘管分類能夠訪問原始類的實例,變量,可是它不能添加自身的任何變量,若是須要添加變量,能夠考慮建立子類;另外,分類能夠重載該類中的另外一個方法,可是一般認爲這種作法是拙劣的設計習慣。其一,重載了一個方法之後,不再能訪問原來的方法。所以,必須當心地將被重載方法中的全部功能複製到替換方法中。若是確實須要重載方法,正確的選擇多是建立子類。若是在子類中重載方法,仍然能夠經過向super發送消息來引用父類的方法;和通常接口方法不一樣的是,沒必要實現分類中的全部方法。這對於程序擴展頗有用,由於能夠在該分類中聲明全部方法,而後在一段時間以後才實現它。
5. Protocol
協議(protocol)是多個類共享的一個方法列表。協議中列出的方法沒有相應的實現。若是定義了本身的協議,則沒必要由本身實際實現它。可是,這就告訴其餘程序員:若是要採用這項協議,則必須實現這些方法。這些方法能夠從超類繼承;能夠在@protocol中使用@optional指令,下面列出的全部方法的指令都是可選的,以後能夠在協議內定義@required指令來列出須要的方法。
可使用conformsToProtocol方法檢查一個對象是否遵循某項協議;定義一項協議時,能夠擴展示有協議的定義,因此如下協議定義:
@protocol Drawing3D <Drawing>
說明Drawing3D協議也採用了Drawing協議。所以,任何採用Drawing3D協議的類都必須實現此協議列出的方法
分類也能夠採用一項協議,如:@interface Fraction (Stuff) <NSCopying, NSCoding>
非正式協議實際上僅僅是一個名稱之下的一組方法。前面描述的@optional指令添加到了Obj-C 2.0語言中,用於取代非正式協議的使用。
6. id類型
id類型是一種通用的對象類型。爲何不把全部的對象都聲明爲id類型呢?使用靜態類型時,編譯器儘量確保變量的用法在程序中始終保持一致。編譯器經過檢查來肯定應用於對象的方法是由該類定義的或者由該類繼承,不然它顯示警告信息。靜態類型是由於它能更好地在程序編譯階段而不是在運行時指出錯誤。使用靜態類型的另外一個緣由是它可以提升程序的可讀性。
id類型是通用指針類型:由於經過指針,也就是內存地址來引用對象,因此能夠自由地將它們在id變量之間來回賦值。所以返回id類型值的方法只是返回指向內存中某對象的指針。而後能夠將該值賦給任何對象變量。由於不管在哪裏,對象老是攜帶它的isa成員,因此即便將它存儲在id類型的通用對象變量中,也老是能夠肯定它的類。
7. Cocoa & Cocoa Touch
Application Kit框架包括普遍的類和方法,它們用來開發交互式圖形應用程序,使得開發文本/菜單/工具欄/表/文檔/剪貼板和窗口之類的過程變得十分簡便。在Mac OSX操做系統中,術語cocoa總的來講指的是Foudation框架和AppKit框架。術語Cocoa Touch是指Foudation框架和UIKit框架。
8. 內存管理
自動釋放池能夠自動釋放添加到該池中的對象所使用的內存。向對象發送一條autorelease消息時,就將該對象放到這個池中。釋放這個池時,添加到該池的全部對象也會一塊兒釋放。
當對象的引用計數達到0時,系統就知道再也不須要這個對象,所以系統就會釋放它的內存,這是經過向對象發送一條dealloc消息而實現的。
經過向對象發送retainCount消息,能夠得到這個對象的引用計數。
若是你的方法中再也不須要一個對象,但須要返回它,那麼向其發送一條autorelease消息,將它標記爲之後釋放。消息autorelease並不影響對象的引用計數。所以它容許消息的發送者使用這個對象,而後仍然在之後當自動釋放池時,釋放這些對象。
若是使用alloc或者copy方法(或使用allocWithZone,copyWithZone或mutableCopy方法)直接建立對象,則由你負責釋放它。每次retain對象時,應該release或者autorelease它。