本文主要介绍和C++不同的地方。
1、类的定义:
一个类有两个文件一个.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结尾。
大括号中间的成员变量,可以表示public和private还有protected。objc的推荐方式是成员变量前面加“_”。
方法分成两种,如果是实例方法,也就是非静态的方法必须以“-”开头,如果是静态方法必须要以“+”开头。
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文件中的私有变量有什么区别?
2、键值编码
@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的反射获取成员变量,不过更加方便。
3、类别(category)
1 @interface User (u) 2 -(void) login; 3 @end
[user login];
类似于的C#的拓展方法。
4、扩展 和类别一样,不过没有()中间的类了
5、委托
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#中的委托时一个意思