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