OC学习日记03-类和对象(二)OC语言中的方法 、设置器与访问器、便利初始化函数与便利构造器

这里写图片描述

类和对象


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];

这里写图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值