1. 程式人生 > >oc基礎語法小結

oc基礎語法小結

原文:http://blog.sina.com.cn/s/blog_b6e3f371010198za.html原文: 這篇博文比較簡潔,到位.但interface部分講解仍然不是很清楚。 第一節總括     這一節是對Objective-C(以後簡稱OC)的簡要介紹,目的是使讀者對OC有一個概括的認識。 1.面象的讀者         在閱讀本文之前,應具備使用與C類似的程式語言(如C,C++,JAVA)的一些經驗,同時熟悉面向物件程式設計。  2.OC簡介         OC是以SmallTalk為基礎,建立在C語言之上,是C語言的超集。20世紀80年代早期由
 Brad J.Cox設計,2007年蘋果公司釋出了OC 2.0,並在iPhone上使用OC進行開發。 3.OC學習內容          學習的內容主要包括語法和Cocoa框架兩部分。本文主要對語法進行介紹。 4.IDE    編寫OC程式最主要的編譯環境是Xcode,它是蘋果官方提供的IDE,官網中的SDK包括Xcode,可以通過下載SDK來獲得它。但是Xcode只支援MacOSX,所以如果要在其它環境下編寫OC程式,要使用其它IDE。Linux/FreeBSD用GNUStep,Windows NT5.x(2000,XP)要先安裝cywin或mingw,然後安裝GNUStep。同時僅僅通過文字編輯器
,GCC的make工具也可以用於開發。 注:如果要使用到Cocoa的話,只能在Apple公司的Xcode上。  5.框架          OC程式設計中主要用到的框架是Cocoa,它是MacOS X中五大API之一,它由兩個不同的框架組成FoundationKit 和ApplicationKit。Foundation框架擁有100多個類,其中有很多有用的、面向資料的低階類和資料型別,如NSString,NSArray,NSEnumerator和NSNumber。ApplicationKit包含了所有的使用者介面物件和高階類。這些框架本文不做重點介紹,如果要深入瞭解可以去看Xcode自帶的文件。
6.特別之處 初次接觸OC時,會發現許多和其它語言不同的地方,會看到很多的+,-,[ ,] ,@,NS等符號,這些符號在以後的程式設計中將經常看到,這部分內容在第二節中介紹。先熟悉一下OC的程式碼:             #import            "ClassA.h"             #import               int            main( int argc, const char *argv[] ) {                 ClassA            *c1 = [[ClassA allocinit];                 ClassA            *c2 = [[ClassA allocinit];                 //            print count                 printf(            "ClassA count: %i\n", [ClassA initCount] );                 ClassA            *c3 = [[ClassA allocinit];                 //            print count again                 printf(            "ClassA count: %i\n", [ClassA initCount] );                 [c1            release];                 [c2            release];                 [c3            release];                 return            0;             }   除了這些語言要素上的不同,OC也提供了一些很好的特性,如類別,扮演(Posing)等,這些在執行時的特性使得程式設計更加靈活。 7.優缺點         每一個語言都有其優缺點,OC也不例外,這就要求在選擇語言時權衡利弊。對於OC,只要善於利用它的優點,你會發現它是一個簡單,靈活,高效的語言。以下列舉了它的一些特點:     優點:類別、扮演(Posing)、動態型別、指標計算、彈性資訊傳遞、不是一個過度複雜的c衍生語言、可通過Objective-c++與c++結合     缺點:沒有名稱空間、沒有操作符過載、不像c++那樣複雜 第二節:對C的擴充套件 1.副檔名       OC是ANSI版本C的一個超集,它支援相同的C語言基本語法。與C一樣,檔案分為標頭檔案和原始檔,副檔名分別為.h和.m。如果要加入c++的語法,需要用到.mm,這裡不做介紹。             .h                      標頭檔案。標頭檔案包涵類的定義、型別、方法以及常量的宣告             .m                      原始檔。這個典型的副檔名用來定義原始檔,可以同時包含C和Objective-C的程式碼。 2.#import   在OC裡,包含標頭檔案有比#include更好的方法#import。它的使用和#include相同,並且可以保證你的程式只包含相同的標頭檔案一次。相當於#include+ #pragma once的組合。 例如要包含Foundation框架中的Foundation.h檔案,可以像下面這樣。             #import    注:每個框架有一個主的標頭檔案,只要包含了這個檔案,框架中的所有特性都可以被使用。 [email protected]符號          @符號是OC在C基礎上新加的特性之一。常見到的形式有@”字串”,%@ , @interface,@implement等。@”字串”表示引用的字串應該作為Cocoa的NSString元素來處理。@interface等則是對於C的擴充套件,是OC面向物件特性的體現。 注:這裡提一個小技巧,只要看到@符號,就可以認為它是對於C的一個擴充套件。 4.NSLog()       在OC中用的列印函式是NSLog(),因為OC是加了一點”特殊語料”的C語言,所以也可以用printf()但是NSLog()提供了一些特性,如時間戳,日期戳和自動加換行符等,用起來更方便,所以推薦使用NSLog()。下面是兩種輸出的對比。         使用NSLog()輸出任意物件的值時,都會使用%@格式說明。在使用這個說明符時,物件通過一個名為description的方法提供自己的NSLog()格式。         下面分別是使用NSLog()和使用printf()的相應輸出:             2010-10-15 14:54:21。426            10_15[1973:207] Hello World!             Hello            World! 注:NS字首告訴你函式來自Cocoa而不是其他工具包。 5.BOOL          BOOL是OC中的布林型別,它和C中的bool有如下區別             BOOL                      YES(1),NO(0)             bool                      true(!0),false(0) 6.id         這是OC新加的一個數據型別,它是一般的物件型別,能夠儲存任何型別的方法。 7.nil         在OC中,相對於C中的NULL,用的是nil。這兩者是等價的。下面是nil的定義。             #define            nil NULL 第三節:建立物件 1.介面和實現 在OC中定義一個類需要有兩個部分:介面和實現。介面檔案包含了類的宣告,定義了例項變數和方法。實現檔案包含了具體的函式的實現程式碼。下圖顯示了一個叫 MyClass的類,它繼承自NSObject基類。類的定義總是從@interface開始到@end結束。在類名後面的是父類的名稱。例項變數被定義 在兩個花括號之間。在例項變數下面的是方法的定義。一個分號用來結束一個變數或者方法。        下面的程式碼顯示了MyClass這個類的實現程式碼。就像類的定義規則一樣,類實現檔案也被兩個標識框起來,一個是 @implementation,還有一個是@end。這兩個指令識別符號告訴編譯器程式從哪裡開始編譯到哪裡結束。類中的方法名稱的定義和它介面檔案中的 定義是一樣的,除了實現檔案中有具體的程式碼以外。             @implementation            MyClass             -            (id)initWithString:(NSString *) aName             {                if            (self = [super init]) {                    count            count = 0;                    data            = nil;                    name            = [aName copy];                    return            self;                }             }             +            (MyClass *)createMyClassWithString: (NSString *) aName             {                return            [[[self alloc] initWithString:aName] autorelease];             }             @end         當你要把一個物件儲存進變數,要使用指標型別。OC同時支援強和弱變數物件。強型別物件在變數型別定義的時候包含了類名。弱物件使用id型別作為例項變數。下面的例子同時顯示了定義MyClass中的強弱兩種型別的變數             MyClass*             myObject1;    // Strong typing             id                   myObject2;    // Weak typing 2.方法         一個方法定義包含了方法型別,返回型別,一個或者多個關鍵詞,引數型別和引數名。在OC中一個類中的方法有兩種型別:例項方法,類方法。例項方法前用(-)號表明,類方法用(+)表明,通過下圖可以看到,前面有一個(-)號,說明這是一個例項方法。         在OC中,呼叫一個方法相當於傳遞一個訊息,這裡的訊息指的是方法名和引數。所有的訊息的分派都是動態的,這個體現了OC的多型性。訊息呼叫的方式是使用方括號。如下面的例子中,向myArray物件傳送insertObject:atIndex:這個訊息。             [myArray            insertObject:anObj atIndex:0];    這種訊息傳遞允許巢狀             [[myAppObject            getArray] insertObject:[myAppObject getObjectToInsert] atIndex:0];    前面的例子都是把訊息傳遞給例項變數,你也可以把訊息傳遞給類本身。這時要用類方法來替代例項方法 。你可以 把他想象成靜態C++類(當然不完全相同)。 類方法的定義只有一個不一樣那就是用加號(+)代替減號(-)。下面就是使用一個類方法。             NSMutableArray*              myArray = nil;    // nil is essentially the same as NULL             //            Create a new array and assign it to the myArray variable.             myArray =            [NSMutableArray arrayWithCapacity:0]; 3.屬性       屬性提供了比方法更方便的訪問方式。通過property識別符號來替代getter和setter方法。使用方法就是在類介面檔案中用@property識別符號,後面跟著變數的屬性,包括 copy, tetain, assign ,readonly , readwrite,nonatomic,然後是變數名。同時在實現檔案中用@synthesize識別符號來取代getter和setter方法。             @property            BOOL flag;             @property            (copy) NSString* nameObject;               //            Copy the object during assignment.             @property            (readonly) UIView* rootView;  // Create only a getter method 介面檔案中使用@property             @synthesize            flag,nameObject,rootView; 實現檔案中使用@synthesize 屬性的另一個好處就是,可以使用點(.)語法來訪問,如下所示:             myObject.flag            = YES;             CGRect              viewFrame = myObject.rootView.frame; 第四節:繼承         繼承的語法如下,冒號後的識別符號是需要繼承的類。             @interface            Circle : NSObject 1.不支援多繼承         要注意的是OC只支援單繼承,如果要實現多繼承的話,可以通過類別和協議的方式來實現,這兩種方法將在後面進行介紹。 2.Super關鍵字         OC提供某種方式來重寫方法,並且仍然呼叫超類的實現方式。當需要超類實現自身的功能,同時在前面或後面執行某些額外的工作時,這種機制非常有用。為了呼叫繼承方法的實現,需要使用super作為方法呼叫的目標。下面是程式碼示例:             @implementation            Circle             -(void)setFill