今天讲了OC中的方法 类方法和实例方法的区别 设置器访问器 便利初始化 便利构造器
OC中的方法
方法:类的功能代码,在(.h)中声明,在(.m)文件中实现。
语法:
-|+ (返回值类型) 方法名 : 参数列表
{
//方法体
}
减号(-)表示 实例方法,(+)表示 类方法
- (void) sayHello; // 实例方法
- (void) sayHelloName : (NSString *)name
Age: (NSInteger)age; //实例方法
// 类方法
注意:
1.类方法可以调用类方法
2.类方法不可以调用实例方法,但是类方法可以通过创建实例对象来访问实例方法
3.类方法不可以使用实例变量。类方法可以使用self,因为self不是实例变量
4.类方法作为消息,可以被发送到类里面去,不能发送到对象里面去
- +(void)hiGuys{
//1.类方法可以调用类方法
//self 是什么玩意?
self 代表当前对象的指针
[self sayHi];
//2.类方法不可以调用实例方法,但是类方法可以通过创建实例对象来访问实例方法
Person *person = [Person new];
[person sayHello];
//3.类方法不可以使用实例变量。类方法可以使用self,因为self不是实例变量
//NSLog(@”name : %@, age : %ld , hobby : %@”,_name,_age,_hobby);
//4.类方法作为消息,可以被发送到类里面去,不能发送到对象里面去
}
设置器
- -|+ (void) setName : (NSString *)name;
访问器
- (NSString *)name;
设置器和访问器的作用;
1.隐藏了实例变量
2.控制实例变量的读写
3.做正确性校验
设置器(setter)和访问器(getter)的命名规则
1.设置器:- (void) set首字母大写的实例变量 : (实例变量的返回值类型) 去掉下划线的实例变量名
2.访问器:- (实例变量的返回值类型)去掉下划线的实例变量名
getter 和 setter 的好处:
1.在 setter 中可以加入合法性检查,比如设置颜色的函数中,对于RGB颜色要判断其值在0~255之间。
2. 更新与被设置变量相关的其它变量的值,比如在一个潜水艇模拟系统中,改变了其水下深度时,要相应的更新所受压强。
3.在debug时,可以在其中,尤其是在setter中加入追踪log。
4.在多线程环境中,如果要保护对象的并发访问,则必须在getter/setter中加入同步锁。
note:
对于类的名称,其首写字母大写
对于变量,其首写字母小写
遵循驼峰命名规则
便利初始化函数
注意命名规范:init开头
*/
-(id)initWithName:(NSString *)name
Age:(NSInteger)age;
/*
便利构造器
便利构造器只不过是把对象分配内存 和 调用便利初始化函数初始化对象的代码封装
起来,让用户使用起来更加方便
*/
- (id) teacherWithName:(NSString *)name
Age:(NSInteger)age;
id:返回的类型是id数据类型,它是动态数据类型,可以指向任何类的对象,而不关心其具体类型,
在运行时检查其具体类型,可以对其发送任何(存在的)消息。
self:指当前对象的指针
super:指向父类对象的指针,子类使用super发送消息的时候,实际上就是告诉子类调用父类的方法。
如果父类没有调用该方法,则继续在继承链上查找,直到寻找到位置,如果找到NSObject的位置
还没找到,就会报错.
-(id)init{
if(self = [super init]){
_name=@"Leee";
_age=22;
}
return self;
}
-(id)initWithName:(NSString *)name
Age:(NSInteger)age{
if (self = [super init]){
_name = name;
_age = age;
}
return self;
}
+(id)teacherWithName:(NSString *)name
Age:(NSInteger)age{
Teacher *teacher = [[Teacher alloc]initWithName:name Age:age];
return teacher;
}
在main函数中的书写:
Person *per = [Person new];
[per sayHello];
[per sayHelloName:@"Leee" Age:111];
[Person sayHi];
[Person hiGuys];
Student *stu = [Student new];
[stu setName:@"Lee"];
[stu setAge:22];
[stu setHobby:@"PLAY LOL"];
NSString *name = [stu name];
NSInteger age = [stu age];
NSString *hobby =[stu hobby];
NSLog(@"name = %@,age = %ld,hobby = %@",name,age,hobby);
Teacher *tea = [[Teacher alloc]init];
[tea sayWord];
Teacher *teach1 = [[Teacher alloc]initWithName:@"爸爸" Age:22];
[teach1 sayWord];
Teacher *teacher2 = [Teacher teacherWithName:@"1" Age:22];
[teacher2 sayWord];