本文主要介紹和C++不一樣的地方。java
一、類的定義:c++
一個類有兩個文件一個.h還有一個.m文件編碼
1 #import <Foundation/Foundation.h> 2 3 4 @interface MyClass : NSObject { 5 @public 6 int _a;//公開方法 7 NSString *_name; 8 @private 9 int _b;//私有方法 10 } 11 - (void)test; //實例方法 12 + (void)static_test;//靜態方法 13 @end
頭文件中內容如上。一個類的聲明用@interface開頭@end結尾。atom
大括號中間的成員變量,能夠表示public和private還有protected。objc的推薦方式是成員變量前面加「_」。spa
方法分紅兩種,若是是實例方法,也就是非靜態的方法必須以「-」開頭,若是是靜態方法必需要以「+」開頭。code
1 #import "MyClass.h" 2 3 4 @implementation MyClass { 5 int a; 6 float b; 7 8 } 9 - (void)test { 10 11 } 12 13 + (void)static_test { 14 15 } 16 17 18 @end
m文件相似c++中的cpp文件,一個文件以@implementation開頭以@end結尾。對象
大括號中間能夠聲明一些變量,這些變量只能在本文件中使用,有點相似於C的全局靜態變量,不過我不明白這個和h文件中的私有變量有什麼區別?blog
二、鍵值編碼it
@interface User : NSObject @property(nonatomic, copy) NSString *name; @property(nonatomic, copy) NSString *pass; @end
1 User *user = [[User alloc] init]; 2 [user setValue:@"jack" forKey:@"name"]; //鍵值編碼 3 [user setValue:@"123" forKey:@"pass"];
相似於java的反射獲取成員變量,不過更加方便。io
三、類別(category)
1 @interface User (u) 2 -(void) login; 3 @end
[user login];
相似於的C#的拓展方法。
四、擴展 和類別同樣,不過沒有()中間的類了
五、委託
1 @protocol Mydelegate//協議的聲明 2 3 - (void)Fun; 4 5 @end 6 7 @interface ClassA : NSObject { 8 9 id <Mydelegate> delegate;//聲明一個委託對象,咱們要把事情委託給實現Mydelegate協議的類 10 11 } 12 @property(assign,nonatomic) id<Mydelegate> delegate; 13 14 - (void)FunToOther; 15 @end
1 @implementation ClassA { 2 3 } 4 5 - (id)init { 6 7 delegate = [ClassB alloc]; 8 return self; 9 10 } 11 12 - (void)FunToOther { 13 14 [delegate Fun];//將消息發送給委託去處理 15 16 } 17 18 @end
1 @implementation ClassB { 2 3 } 4 -(void) Fun{ 5 NSLog(@"BBBBBBB"); 6 7 } 8 @end
1 ClassA *a1 = [[ClassA alloc] init]; 2 [a1 FunToOther];
這個就和C#中的委託時一個意思