#import <Foundation/Foundation.h> int main(int argc, char *argv[]){ @autoreleasepool{ NSLog(@"Hello World!"); } return 0;} c++ 中類與方法在編譯的時期就已經確定 objecTive——v 類->訊息 :運行時期確定,如果沒有拋出exception 比如:[obj method: argument]; ===》[car fly]; 優缺點:C++ 支援多繼承,函數調用非常的快,編譯時間期確定了,缺點不支援動態綁定 objective-c允許傳送任何資料給類,不需要一一檢查類型,傳nil不會奔潰 Interface介面區段裡頭清楚定義了類的名稱,實體變數(instance variable),以及方法。 以關鍵字@interface作為區段起頭,@end結束區段。@interface MyObject : NSObject { int memberVar1; // 實體變數 id memberVar2;}+(return_type) class_method; // 類方法 -(return_type) instance_method1; // 實體方法-(return_type) instance_method2: (int) p1;-(return_type) instance_method3: (int) p1 andPar: (int) p2;@end方法前面的+/-號代表方法的類型:加號(+)代表類方法(classmethod),不需要實體就可以呼叫,近於C++的靜態成員函數(static member function)。減號(-)即是一般的實體方法(instance method)。參數傳遞: objective-c 用(:)來進行參數的傳遞, 優點: 使參數沒有必要複數於方法調用的末尾,提高了代碼的可讀性: 比如: - (void) setColorToRed: (float)red Green: (float)green Blue:(float)blue; /* 宣告方法 */ [myColor setColorToRed: 1.0 Green: 0.8 Blue: 0.2]; /* 來電者法 */ 這個方法的全名是setColorToRed:Green:Blue:。每個冒號後面都帶著一個形態為float的參數,分別代表紅,綠,藍三色。 Implementation實現區段則撰寫方法的實際運行代碼。以關鍵字@implementation作為區段起頭,@end結尾。@implementation MyObject +(return_type) class_method { .... //method implementation}-(return_type) instance_method1 { ....}-(return_type) instance_method2: (int) p1 { ....}-(return_type) instance_method3: (int) p1 andPar: (int) p2 { ....}@end建立對象 : Objective-C建立物件需透過兩個訊息:alloc以及init。alloc的作用是指派記憶體空間,init則是對物件做初始化。 init與alloc都是定義在NSObject裡的類方法,當物件收到這兩個訊息並做出正確回應後,新實體才算準備妥當。以下即為範例 MyObject *my = [[MyObject alloc] init] // 1.0 2.0 MyObject *my = [MyObject new] // 自訂初始化可以 複寫init方法。 來添加額外的工作(類似構造方法) -(id) init{ if ( self = [super init] ){ // 必須呼叫父類的方法 //do someting here.... } return self; } (note: java 中介面必須實現中的所有方法, o——c中2.0 後可以選擇性的實現) 動態類型:以下三種聲明提供了一個比一個明顯的類型資訊。這三種聲明在運行時是等同的,但附加的類型資訊允許編譯器在編譯時間檢查變數類型,並在類型不符的情況下提出警告。- setMyValue:(id) foo;該聲明表示“foo”可以是任何類的執行個體。- setMyValue:(id <aProtocol>) foo;該聲明表示“foo”可以是任何類的執行個體,但它必須符合“aProtocol”協議。- setMyValue:(NSNumber*) foo;該聲明表示“foo”必須是“NSNumber”的執行個體。/**型一致,而對於動態類型語言則完全沒有這方面的問題。[編輯] 轉寄Objective-C允許對一個對象發送訊息,不管它是否能夠響應之。除了響應或丟棄訊息以外,對象也可以將訊息轉寄到可以響應該訊息的對象。轉寄可以用於簡化特定的設計模式,例如觀測器模式或代理模式。Objective-C運行時在Object中定義了一對方法:轉寄方法:- (retval_t) forward:(SEL) sel :(arglist_t) args; // with GCC- (id) forward:(SEL) sel :(marg_list) args; // with NeXT/Apple systems回應程式法:- (retval_t) performv:(SEL) sel :(arglist_t) args; // with GCC- (id) performv:(SEL) sel :(marg_list) args; // with NeXT/Apple systems希望實現轉寄的對象只需用新的方法覆蓋以上方法來定義其轉寄行為。無需重寫回應程式法performv::,由於該方法只是單純的對響應對象發送訊息並傳遞參數。其中,SEL類型是Objective-C中訊息的類型。不是很懂:*/動態特性:支援運行時 動態類方法的覆蓋 和 添加新方法,同時無需再次編譯Objective-C++是C++的擴充,類似於Objective-C是C的擴充由於在融合C++與Objective-C兩種語言的特性方面沒有做特別的工作,因此有以下限制:C++類不能從Objective-C類繼承,反之亦然。Objective-C定義內部不能定義C++命名空間。Objective-C類的成員變數不能包括不含預設建構函式和/或含有虛方法的C++類對象,但使用C++類指標並無如此限制(可以在 -init方法中對之進行初始化)。C++“傳遞值”的特性不能用在Objective-C對象上,而只能傳遞其指標。Objective-C聲明不能存在在C++模板聲明中,反之亦然。但Objective-C類型可以用在C++模板的參數中。Objective-C和C++的錯誤處理語句不同,各自的語句只能處理各自的錯誤。Objective-C錯誤使得C++對象被退出時,C++解構函式不會被調用。新的64位運行時解決了這個問題。Objective-C 2.0”的發布,其增加了“現代的垃圾收集,文法改進[3],運行時效能改進[4]垃圾收集Objective-C 2.0提供了一個可選的垃圾收集器。在向後相容模式中,Objective-C運行時會將引用計數操作,例如“retain”與“release”變為無操作。當垃圾收集啟用時,所有的對象都是收集器的工作對象。普通的C指標可以以“__strong”修飾,標記指標指向的對象仍在使用中。被標記為“__weak”的指標不被計入收集器的計數中,並在對象被回收時改寫為“nil”。iOS上的Objective-C 2.0實現中不包含垃圾收集器。垃圾收集器運行在一個低優先順序的後台線程中,並可以在使用者動作時暫停,從而保持良好的使用者體驗。[5]屬性:屬性總是為公用的,其目的為提供外部類存取(也可能為唯讀)類的內部變數的方法。屬性可以被聲明為“readonly”,即唯讀,也可以提供儲存方法包括“assign”,“copy”或“retain”(簡單的賦值、複製或增加1引用計數)。預設的屬性是原子的,即在訪問時會加鎖以避免多線程同時訪問同一對象,也可以將屬性聲明為“nonatomic”(非原子的),避免產生鎖。枚舉比起利用NSEnumerator對象或在集合中依次枚舉,Objective-C 2.0提供了快速枚舉的文法。在Objective-C 2.0中,以下迴圈的功能是相等的,但效能特性不同。// 使用NSEnumeratorNSEnumerator *enumerator = [thePeople objectEnumerator];Person *p; while ( (p = [enumerator nextObject]) != nil ) { NSLog(@"%@ is %i years old.", [p name], [p age]);}// 使用依次枚舉for ( int i = 0; i < [thePeople count]; i++ ) { Person *p = [thePeople objectAtIndex:i]; NSLog(@"%@ is %i years old.", [p name], [p age]);}// 使用快速枚舉for (Person *p in thePeople) { NSLog(@"%@ is %i years old.", [p name], [p age]);}快速枚舉可以比標準枚舉產生更有效代碼,由於枚舉所調用的方法被使用NSFastEnumeration協議提供的指標算術運算所代替了。[6]