本文主要介绍和C++不同的地方。
1、类的定义:
一个类有两个文件一个.h还有一个.m文件
#import <Foundation/Foundation.h> @interface MyClass : NSObject {
@public
int _a;//公开方法
NSString *_name;
@private
int _b;//私有方法
}
- (void)test; //实例方法
+ (void)static_test;//静态方法
@end
头文件中内容如上。一个类的声明用@interface开头@end结尾。
大括号中间的成员变量,可以表示public和private还有protected。objc的推荐方式是成员变量前面加“_”。
方法分成两种,如果是实例方法,也就是非静态的方法必须以“-”开头,如果是静态方法必须要以“+”开头。
#import "MyClass.h" @implementation MyClass {
int a;
float b; }
- (void)test { } + (void)static_test { } @end
m文件类似c++中的cpp文件,一个文件以@implementation开头以@end结尾。
大括号中间可以声明一些变量,这些变量只能在本文件中使用,有点类似于C的全局静态变量,不过我不明白这个和h文件中的私有变量有什么区别?
2、键值编码
@interface User : NSObject
@property(nonatomic, copy) NSString *name;
@property(nonatomic, copy) NSString *pass; @end
User *user = [[User alloc] init];
[user setValue:@"jack" forKey:@"name"]; //键值编码
[user setValue:@"" forKey:@"pass"];
类似于java的反射获取成员变量,不过更加方便。
3、类别(category)
@interface User (u)
-(void) login;
@end
[user login];
类似于的C#的拓展方法。
4、扩展 和类别一样,不过没有()中间的类了
5、委托
@protocol Mydelegate//协议的声明 - (void)Fun; @end @interface ClassA : NSObject { id <Mydelegate> delegate;//声明一个委托对象,我们要把事情委托给实现Mydelegate协议的类 }
@property(assign,nonatomic) id<Mydelegate> delegate; - (void)FunToOther;
@end
@implementation ClassA { } - (id)init { delegate = [ClassB alloc];
return self; } - (void)FunToOther { [delegate Fun];//将消息发送给委托去处理 } @end
@implementation ClassB { }
-(void) Fun{
NSLog(@"BBBBBBB"); }
@end
ClassA *a1 = [[ClassA alloc] init];
[a1 FunToOther];
这个就和C#中的委托时一个意思