本人見識過很多的開發語言,C、C++、Java、Python、Ruby、Lua、PHP,看得多了,基本上初看一種新的語言也能很快猜出個大概這個語言的文法特點,但是初看Objective-C的時候,完全被震住了,會有一種霧裡看花的感覺!
但是通過簡單的閱讀一些文檔後,覺得Objective-C並不像外表看起來的那麼恐怖,那麼高不可攀,在此就簡單總結一下Objective-C的特點。
Objective-C特性概括
- Objective-C是C的超集,也就是說C有的Objective-C都有,Objective-C多了C自身沒有的OO(物件導向)特性。
- Objective-C預設副檔名為 .m 。標頭檔副檔名跟普通C一樣 .h 。
- Objective-C推薦引入標頭檔的方式為:#import ,好處是同一個標頭檔只引入一次,而不用多餘的代碼。
- Objective-C定義類的方法:
@interface Person {
int age;
int hight;
}
-(int) func1;
-(void) func2: (int) n;
@end
@interface 與 @end之間為類的定義,@interface後面 { ... } 之間定義類的成員變數,
下面定義類的方法:(傳回值類型) 方法名:(參數類型)參數
- Objective-C實作類別的方法:
@implementation Person
-(void) func1 {
printf( "%i/%i", age, hight );
}
-(void) func2: (int) n {
age = n;
}
@end
@implementation 與 @end 之間為類的實現
- 類的執行個體化:
Person *ps = [[Person alloc] init];
這裡【不能】像C++那樣:Person ps; 來執行個體化一個Person的變數。另Objective-C都是使用指標來操作對象的。
- 類的方法調用:
[ps func1];
[ps func2: 10]
前者為沒有參數的方法調用,後者為有一個參數的方法調用。
- 多參數方法的定義及調用:
-(void) func2: (int) n Label2: (int) m Label3: (int) p; //此句放到 @interface @end類方法定義中 //下面的代碼放到 @implementation @end之間。
-(void) func2: (int) n Label2: (int) m Label3: (int) p{
age = n;
height = m;
sth = p; //此處第三個僅用於表達多個參數的情況,與第一個例子不一致。
}
//下面為調用代碼
[ps func2: 53 Label2: 89 Label3: 982];
這裡可能很多人覺得怪異,為何後面的參數都有標籤,而第一個沒有。
先說下什麼是標籤(像上面的Label2,Label3):標籤是用於判斷對應參數用途的一個標記,也就是如果你沒有心情可以隨便取名,當然推薦取標籤名的時候最好能反應這個參數的用途,或這個方法在當前這些參數時候的用途。
為何第一個參數沒有標籤呢?其實你可以把第一個方法名當成是第一個參數的標籤,這樣每一個參數都有一個標籤,然後一串的參數作為【訊號】發送給對象。
寫的時候,為了美觀,代碼整理成如下樣子:
[ps func2: 53
Label2: 89
Label3: 982];
這樣一個標籤對應一個參數,非常直觀。
- 存取權限:Objective-C也像C++一樣有 public private protect 三種存取權限,預設的許可權是 protected。
public 關鍵字修飾資源,可以在任何地方訪問。
protected 關鍵字修飾資源,可以在類內和其子類裡訪問。
private 關鍵字修飾資源,只能在類內訪問。
- 外部存取類的public成員方法:
a->publicVar = 5; //其中 a是一個對象 publicVar是一個public的成員
- 因為Objective-C裡面成員變數預設使用protected(如果聲明為public不太安全),也就是本類,及子類中能訪問,而外部不能直接存取,所以如果你想要外部存取或改變成員變數的值就要定義一些如 setXXX getXXX(O-C中預設是沒有get的,而直接是XXX)的方法。setXXX用來設定成員變數值,而 XXX方法用來取得成員變數的值。為了簡化操作,O-C引入了兩個關鍵字 @property 和 @synthesize。就不用寫一堆繁雜的代碼。
//定義的時候
@interface Fraction: NSObject {
int numerator;
int denominator;
} -(void) print;
//-(void) setDenominator: (int) d;
//-(int) denominator;
@property (retain) int denominator; //等於上面兩句去掉注釋
//-(void) setNumerator: (int) n;
//-(int) numerator;
@property (retain) int numerator; //等於上面兩句去掉注釋
@end
//實現的時候
@implementation
@synthesize denominator;
@synthesize numerator;
@end
- 聲明property的文法為:
@property (參數) 類型 名字;分為三類:
1,讀寫屬性(readwrite/readonly):顧名思義不用多說
2,設定屬性(assign/retain/copy):assign為直接賦值,適合數實值型別的;retain最常用,一般對象都用這個代表保留;copy為複製,多用於字串。
3,原子性atomicity(nonatomic):預設是atomic,如果是多線程的程式要保證某一個成員變數的一致性,須使用 atomic。
- O-C中的 nil 其實是一個類型為 id 的對象,所以可以給 nil 傳遞資訊如 [nil message1]。
- O-C中的BOOL型資料包括 YES 及 NO,而非 TRUE 及 FALSE。
- O-C中的 Protocol 就像C++中的 介面。
//定義定義協議
@protocol Printing
-(void) print;
@end //引入協議
@interface Fraction: NSObject <Printing, NSCopying> {
int numerator;
int denominator;
}
-(Fraction*) initWithNumerator: (int) n denominator: (int) d;
-(void) setNumerator: (int) d;
-(void) setDenominator: (int) d;
-(void) setNumerator: (int) n andDenominator: (int) d;
-(int) numerator;
-(int) denominator;
@end
//在主檔案中只要對應實現 print這個方法就行了。
- O-C沒有方法重載 over loading