OC中类
OC中类的定义
在Xcode中创建一个新的类,会自动给你生成两个文件一个是.h另外一个是.m文件,你新创建的类默认继承了NSObject类,因为有一些方法都需要基类中的方法。比如alloc分配内存
OC中用来描述类的使用@interface 类名:父类
来进行定义然后用@end
来定义类的结束
@interface NsFirst : NSObject{int _age;int _no;
}
- (void )setAge:(int)age;
-(int)getAge;
-(void) setNo:(int) no;
-(int) getNo;
@end
OC中类的实现
跟C++不同的一点,OC中的类的实现并不能和声明放在一起,否则编译会报错。而在C++中虽然强调要分开写,但写到同一个文件中也并不会出错,而在OC中就不是这样
OC中新开一个文件用来进行类的实现,用@implementation 类名
开始进行实现,用@end
对实现进行结束标记
@implementation NsFirst
-(void )setAge:(int)age{_age = age;
}
-(int)getAge{return _age;
}
-(void)setNo:(int)no{_no = no;
}
-(int)getNo{return _no;
}
@end
类的方法
对于每一个类都有静态方法(对于类的方法)和动态方法(对于对象的方法),C++中调用静态方法用的是类作用域运算符::
去进行调用,对于动态方法通过->或者.两个运算法来进行调用
而在OC中调用相应的方法都是通过消息发送,也就是[]这个运算符
//对于上面的类进行相应方法调用
id ns = [[NsFirst alloc] init];
[ns setAge:100];
NSLog(@"age is %i",[ns getAge]);
自定义构造方法
一般我们使用的init方法是编译器默认的一种动态方法,会给对象初始化为0,而有些时候我们需要初始化后进行赋值,所以此时就需要重写init方法
重写init方法
- 自己写的init方法名称不能与系统一样
- init方法的步骤
- 先调用基类构造
- 判断是否对象是否创建成功,成功后进行赋值操作
- 返回当前对象self
@interface Student : NSObject
@property int age;
@property int no;
//自己写一个构造方法
-(id)initWithAge:(int)age :(int)no;
@end@implementation Student
-(id)initWithAge:(int)age :(int)no{//首先调用super的init的方法 //判断是否初始化成功if(self = [super init]){//赋值self.age = age;self.no = no;} //返回return self;
}
@end
打印对象信息时的description方法
关于多文件编译
OC中可以有多个.h和.m文件,但入口函数都是main函数,而且OC中没有命名空间,所以两个文件中的类名是可能重名的,所以我们尽可能命名使类名不能出现重名的情况。
点语法
C++中如果定义了对象,可以通过对象名.的方式对对象中属性进行操作,在OC中也提供了这种类似的方式
OC中的点语法要去使用的话,必须要有相应的set方法且set方法设置的属性必须与点语法后的属性名匹配
@interface Person : NSObject{int _age;int _no;
}
//-(void)setAge:(int)age:(int)no;
-(void )setAge:(int)age;
-(void )setNo:(int)No;
-(int)getAge;
-(int)getNo;
@end#import "Person.h"
int main(int argc, const char * argv[]) {@autoreleasepool {// insert code here...Person* p = [[Person alloc] init];p.age = 10; //这里就相当于调用setAge方法,但注意setAge方法只能对age这一个属性进行操作p.no = 20;
// [p setAge:10 :20];int age = [p getAge];int no = [p getNo];NSLog(@"age is %i and no is %i",age,no);}return 0;
}
@propety
在写OC中如果给每个属性都写上get和set方法,显得代码太过于冗余,可以使用@propety来定义成员变量,这样编译器就可以自动为我们进行set方法和get方法的声明
- @propety = 声明set和get方法
- @synthesize = 实现set和get方法
@interface Property : NSObject{int age;int no;float height;
}
@property int age;
//-(void) setage:(int)newAge;
//-(int)age;
@property int no;
@property float height;
@end@implementation Property@synthesize age;
@synthesize height;
@synthesize no;
@end
如果在有很多的成员变量例如如下情况
@interface Property : NSObject{int age;int age1;int age2;
}
那么使用@propety默认声明与其同名的成员变量的set和get方法
使用@propety声明变量后编译器自动帮助我们声明成员变量,我们就不用再手动声明变量。自动生成的变量为私有的.
@synthesize 实现的成员变量如果没有显示定义,则会隐式创建一个与其名称相同的变量,若是想要其生成的方法是我显示定义的方法,则需指定实现具体的哪个变量
@synthesize age = _age
目前版本中,一但使用@propety声明了变量,编译器会自动帮助我们生成@synthesize,自动帮我们实现
如果我们觉的编译器帮助我们生成的方法并不符合我们的预期,那么我们可以自己实现相应的get方法和set方法,编译器就不会再帮我们实现了,如果我们只想要get或者set两者中的任意一个的话,我们只需要实现其中的任意一个就行,另外一个编译器依旧会帮助我们实现