关闭

self 关键字的使用

102人阅读 评论(0) 收藏 举报
分类:

根据上一篇的内容,当我们访问成员变量的时候,使用的是对象调用set的方法实现,但是有时候代码会很繁琐,所以为了解决这一问题,采用了self关键字访问;

    1:self 的使用场合:只能用在方法(对象方法和类方法中),不能出现在函数中

    2:每次调用方法的时候,系统会自动创建self指针

    3:使用“self->成员变量名”访问当前方法调用的成员变量名

    4:使用【self 方法名】调用方法;

#import<Foundation/Foundation.h>

@interface Car : NSObject
{
    int  _wheels;
}

-(void)setWheels:(int)wheels;
-(int)wheels;
-(void)run;
@end
@implementation Car
-(void)setWheels:(int)wheels
{
    _wheels=wheels;
}
-(int)wheels
{
    return _wheels;
}
-(void)run
{
    NSLog(@"%i个轮子的车子跑起来了",_wheels);
}
@end
int main(int argc,char *argv[])
{
    Car *car =[Car new];
    [car setWheels:4];
    [car run];
    NSLog(@"车子的个数为:%i",[car wheels]);
}
运行结果为:


但是当我们将run 方法改变为:

-(void)run
{
    int _wheels=10;
    //采用就近原则,访问的是内部的局部变量,打印结果为10,所以代码在运行过程中会先在类方法内部中找,如果没有,才会在成员变量中查找,所以局部变量不要和成员变量同名
    NSLog(@"%i个轮子的车子跑起来了",_wheels);
}
运行结果为:

所以当我们想在run方法中打印出对象的成员变量的时候,就可以采用self->_wheels 的方式实现;

-(void)run
{
    int _wheels=10;
    //self是一个特殊的指针,只在@implementation 和 @end中才有
    //self指向方法调用者,self其实是方法中的内置指针,每次调用方法,都会有self这个指针
    NSLog(@"%i个轮子的车子跑起来了",self->_wheels);
}
运行结果:

self的内存实现讲解:

当我们创建Car对象的时候,对象中包含实例变量_wheels= 0,和方法列表(-setWheels,-wheels,-run)指针变量car指向Car对象,设地址为ffc0;

执行【car setWheels:4],调用-setWheels方法,将对象中的成员变量更改为:_wheels=4

执行完 【car setWheels:4],释放调用的方法列表:

继续执行【car run的方法】:方法内部有局部变量_wheels = 10和一个self=ffc0的指针


所以这时候self指向的wheels依旧为对象的wheels=4

5:使用【self 方法名】实现方法调用

#import <Foundation/Foundation.h>

@interface Calculator : NSObject
{
        double _number;
}
-(double)SumOfnum:(double)num1 andNum2:(double)num2;  //实现计算器的加法运算
-(double)average;//实现计算器的平均数运算
@end
@implementation Calculator
-(double)SumOfnum:(double)num1 andNum2:(double)num2
{
    return num1 + num2;
}
-(double)averge
{
    //直接调用计算器中的两个数相加的方法
    double ave = [self SumOfnum:2 andNum2:3]/2;
    return ave;
}
@end
int main(int argc,char *argv[])
{
    Calculator *c = [Calculator new];
    double sum = [c SumOfnum:2 andNum2:4];
    NSLog(@"两个数的和为%f",sum);
    NSLog(@"平均数为:%f",[c averge]);
   
}



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:13473次
    • 积分:518
    • 等级:
    • 排名:千里之外
    • 原创:37篇
    • 转载:9篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论