类和对象
OC语言中的方法
方法:
类的功能代码,在(.h)文件中声明,在(.m)文件中实现。
语法:
-|+(返回类型)方法名:参数列表
{
//方法体
}
(—)表示:实例方法,
(+)表示:类方法。
-(void)sayHello; //实例方法
1. (void)sayHelloName:(NSString *)name
Age:(NSInteger )age; //无返回值有参数的实例方法
+(void)sayHi; //无返回值的类方法
+(void)hiGuys;
注意:
1.类方法可以调用类方法
2.类方法不可以调用实例方法,但是类方法可以通过判断实例对象来访问实例方法;
3.类方法不可以使用实例变量。类方法可以使用self,因为self不是实例变量;
4.类方法作为消息,可以被发送到类里面去,不能发送到
首先,在.h文件中声明我们要使用的对象和方法;
{
NSString *_name;
NSInteger _age;
NSString *_hobby;
}
-(void)sayHello; //实例方法
- (void)sayHelloName:(NSString *)name
Age:(NSInteger )age; //无返回值有参数的实例方法
+(void)sayHi; //无返回值的类方法
+(void)hiGuys;
然后我们在.m文件中写入无返回无参数的实例方法、无返回值有参数的实例方法,以及无返回值的类方法;
-(void)sayHello{
NSLog(@"sayHello");
}
-(void)sayHelloName:(NSString *)name Age:(NSInteger)age
{
NSLog(@"Hello guys!My name is %@.I am %ld years old.",name,age);
}
+(void)sayHi{
NSLog(@"sayHi");
}
+(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);
最后我们在主函数中引用一下我们刚刚创建的几个方法,这里重点要 标注一下 [person sayHelloName:@”Aaaa” Age: 25];这种带参数的方法;这种是很多方法的一种通用形式,后面很多特殊的函数以及构造器都是和这种方法相像的,一定要先去理解这种参数的意义。(与C的指针有一点相关)
Person* person =[Person new];
[person sayHello];
[person sayHelloName:@"Aaaa" Age: 25];
[Person sayHi];
[Person hiGuys];
设置器与访问器
设置器和访问器的作用
1.隐藏了实例变量
2.控制变量的读写;
3.做正确性校验;
(主要就是用来设置和访问@protected和@private作用域的值)
设置器(setter)和访问器(getter)的规命名规则
1.设置器:-(void)set首字母大写的实例变量:(实例变量的返回值类型)去掉下划线的实例变量名;
2.访问器 :-(实例变量的返回值类型)去掉下划线的实例变量;
note:
对于类的名称,其首写字母大写
对于变量,其首写字母小写
遵循驼峰命名规则。
在.h文件中我们对设置器与访问器进行编写,其实通过设置器和访问器我们不难发现,设置器与访问器其实也是一种方法,所以
我们可以把设置器看作:无返回值有参数的实例方法;访问器看作有返回值无参数的实例方法;这样来看的话,在.m文件中我们也可以很容易理解其中的内容。
{
//@protected
NSString *_name;
NSInteger _age;
NSString *_hobby;
}
//设置器与访问器
//对于_name属性的设置器
-(void)setName:(NSString*)name;
//name访问器
-(NSString *)name;
//对于_age属性的设置器
-(void)setAge:(NSInteger)age;
//age访问器
-(NSInteger)age;
//对于_hobby属性的设置器
-(void)setHobby:(NSString*)hobby;
//hobby访问器
-(NSString *)hobby;
在.m文件中,我们进行设置器和访问器的书写,设置器就是将引入的参数的值赋值给实例变量,访问器就是将需要的实例变量的值返回回去:
-(void)setName:(NSString*)name{
_name= name;
}
-(NSString *)name{
return _name;
}
//做正确性校验
-(void)setAge:(NSInteger)age
{
if(_age>=0|_age<18){
_age = 18;
}else if(_age < 0){
NSLog(@"请重新输入正确的年龄");
}else{
_age = age;
}
}
-(NSInteger)age{
return _age;
}
-(void)setHobby:(NSString *)hobby{
_hobby= hobby;
if([_hobby isEqualToString:@"play LOL"]){
_hobby=@"niuB";
}else{
_hobby=@"lowB";
}
}
-(NSString *)hobby{
return _hobby;
}
在主函数main.m中,我们可以建立一个stu的对象,然后对其调用设置器,以及使用访问器访问我们需要的数据,看一下最终效果:
Student* stu=[Student new];
[stu setName:@"Jack"];
[stu setAge:25];
[stu setHobby:@"play LOL"];
NSString *name=[stu name];
NSInteger age =[stu age];
NSString *hobby=[stu hobby];
NSLog(@"name =%@ ,age= %ld ,hobby=%@",name ,age,hobby);
运行结果为:
便利初始化函数与便利构造器
- id:返回的类型是id数据类型,它是动态数据类型,可一直指向任何类的对象,而不关心其具体类型,在运行时检查其具体类型,可以对其发送任何(存在的)消息。
- self:指当前对象的指针。
- super:指向父类对象的指针,子类使用super发送消息的时候,实际上就是告诉子类调用父类的方法。如果父类没有定义该方法,则继续在继承链上查找,直到寻找到位置,如果找到NSOject的位置还没有找到,就会报错。
便利构造器
便利构造器只不过是把对象分配内存 和 调用便利初始化函数初始化对象的代码封装起来,让用户使用起来更加方便。
我们知道alloc的作用是为建立的对象分配空间,而init 的作用是为建立的对象的变量进行初始化,而如果我们对变量的值有要求的时候,我们就可以通过重写init 进行自定义初始化函数。
便利初始化函数可以通过方法-(id)init进行全局定义;
而有时候我们只需要个别改变的话,我们就可以通过使用-(id)initWithName
而对alloc以及-(void)initWithName进行封装的话,就形成了便利化构造器。
这是.h文件的代码:
@interface Teacher : NSObject
{
NSString *_name;
NSInteger _age;
NSString *_hobby;
}
-(void)sayWord;
//便利初始化函数
//注意命名规范:init开头
-(id)initWithName:(NSString *)name
Age:(NSInteger)age;
+(id)teacherWithName:(NSString *)name Age:(NSInteger)age;
这是.m文件的代码:
-(void)sayWord{
NSLog(@"name= %@ ,age=%ld",_name,_age);
}
-(id)init{
if(self =[super init]){
_name=@"Rick";
_age=25;
}
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.m的代码:
// 便利初始化函数 (-) 与 便利构造器 (+)
Teacher *teacher=[[Teacher alloc]init];
[teacher sayWord];
Teacher *teacher1=[[Teacher alloc]initWithName:@"Jack" Age:25];
[teacher1 sayWord];
Teacher *teacher2=[Teacher teacherWithName:@"Rick" Age:25];
[teacher2 sayWord];