self 关键字的使用

原创 2016年06月02日 16:06:01

根据上一篇的内容,当我们访问成员变量的时候,使用的是对象调用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]);
   
}



Java this 关键字用法

介绍Java中this关键字的用法,包括在构造方法中this关键字的用法,非在构造方法中this关键字的用法,继承关系下this关键字含义的变化,以及super和this关键字的异同。...
  • ccpat
  • ccpat
  • 2015年03月21日 13:42
  • 4855

Python中self用法详解

Python中类、实例以及self的详解
  • CLHugh
  • CLHugh
  • 2017年07月11日 23:03
  • 2908

Swift标识符和关键字

任何一种计算机语言都离不开标识符和关键字,下面我们将详细介绍Swift标识符和关键字。标示符标识符就是给变量、常量、方法、函数、枚举、结构体、类、协议等指定的名字。构成标识符的字母均有一定的规范,Sw...
  • tonny_guan
  • tonny_guan
  • 2014年08月09日 19:59
  • 8826

static和const关键字的使用(self::)

static关键字是在类中描述成员属性和成员方法是静态的;静态的成员好处在哪里呢?前面我们声明了“Person”的人类,在“Person”这个类里如果我们加上一个“人所属国家”的属性,这样用“Pers...
  • RanQi2016
  • RanQi2016
  • 2016年06月24日 16:35
  • 283

——黑马程序员——OC中self和super关键字的使用

-----------android培训、java培训、java学习型技术博客、期待与您交流!-----------
  • yhp1095785221
  • yhp1095785221
  • 2015年11月04日 21:54
  • 172

OC基础-self关键字的用法10

1. 在方法的内部可以定义1个和属性名相同的局部变量.     这个时候 如果在方法中访问这个同名的变量,访问的是局部变量.     问题1: 如果这个时候我就是要访问那个同名的属性,怎么办? ...
  • liuyinghui523
  • liuyinghui523
  • 2017年06月24日 12:41
  • 106

ios开发-OC类方法和self关键字的学习

----------android培训、java培训、java学习型技术博客、期待与您交流!------------  今天我学习了类方法和self关键字的用法,下面具体讲讲: 一. 方法:在OC中,...
  • anuodexiaodi
  • anuodexiaodi
  • 2015年03月14日 22:43
  • 146

php面向对象中this,self,parent三个关键字的含义

php面向对象中this,self,parent三个关键字的含义this,self,parent三个关键字从字面上比较好理解,分别是指这、自己、父亲。 this是指向当前对象的指针(姑且用C里面的指针...
  • qq_26291823
  • qq_26291823
  • 2016年07月15日 13:46
  • 278

php中this,self,parent三个关键字

this,self,parent三个关键字从字面上比较好理解,分别是指这、自己、父亲。 this是指向当前对象的指针(姑且用C里面的指针来看吧) self是指向当前类的指针 parent...
  • skynet001
  • skynet001
  • 2012年04月27日 19:38
  • 49299

黑马程序员-Object-C封装,和对象.类方法,self关键字的用法总结

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 一.封装 (encapsulation) 隐藏对象的属性和实现细节,仅对外公开接口,控制在程序...
  • CrazyDony
  • CrazyDony
  • 2014年12月28日 16:05
  • 466
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:self 关键字的使用
举报原因:
原因补充:

(最多只允许输入30个字)