05-self关键字
1、self关键字的用途
1> 谁调用了当前方法,self就代表谁
a、self出现在对象方法中,self就代表对象
b、self出现在类方法中,self就代表类(类名)
self的本质是指针,指向了方法调用者, 代表着当前对象或者当前类, 谁调用当前方法就指向谁。
2> 在对象方法中利用 self ->成员变量名 访问当前对象内部的成员变量
3> [self 方法名]可以调用其他对象方法或类方法
1 #import <Foundation/Foundation.h> 2 //类的声明 Person类 3 @interface Person : NSObject 4 - (void)run;//跑 5 - (void)eat;//吃 6 @end 7 8 //类的实现(方法实现) 9 @implementation Person 10 - (void)run 11 { 12 NSLog(@"人在跑"); 13 } 14 15 - (void)eat 16 { 17 //self在对象方法中,代表对象 18 //self调用了run方法 19 [self run]; 20 NSLog(@"人在吃"); 21 } 22 @end 23 24 int main(int argc, const char * argv[]) 25 { 26 //创建一个对象 27 Person *person1 = [Person new]; 28 [person1 run]; 29 [person1 eat]; 30 return 0; 31 }
2、成员变量和局部变量同名
1> 当成员变量和局部变量同名时,采取就近原则,访问的是局部变量;
2> 用self访问成员变量,区分同名的局部变量
3、使用细节
(1)出现的地方:所有OC方法中(对象方法/类方法),不能出现在函数
(2)作用
1>使用"self ->成员变量名" 访问当前方法调用的成员变量
2>使用"[self 方法名]",来调用方法(对象方法/类方法)
4、常见错误
(1) 低级错误:用self去调用函数
(2) 类方法中用self调用对象方法;对象方法中用self调用类方法
(3) self死循环
5、练习
(1)狗在跑之前叫两声
1 /* 2 狗在跑之前叫两声 3 */ 4 5 #import <Foundation/Foundation.h> 6 7 @interface Dog : NSObject 8 9 - (void)bark; 10 - (void)run; 11 @end 12 13 @implementation Dog 14 - (void)bark 15 { 16 NSLog(@"汪汪汪!"); 17 } 18 - (void)run 19 { 20 //对象方法里面,self代表的是对象 21 [self bark]; 22 NSLog(@"跑跑跑!"); 23 } 24 @end 25 26 int main(int argc, const char * argv[]) 27 { 28 Dog *dog1 = [Dog new]; 29 [dog1 run]; 30 return 0; 31 }
(2)计算器类,计算平均值(调用求和方法)
1 /*
2 计算器类,计算平均值(调用求和方法)
3 */
4 #import <Foundation/Foundation.h>
5 @interface Calculator :NSObject
6 + (int)sumOfNum1: (int)num1 andNum2: (int)num2;
7 + (int)averageOfNum1: (int)num1 andNum2:(int)num2;
8 @end
9
10 @implementation Calculator
11 + (int)sumOfNum1: (int)num1 andNum2: (int)num2
12 {
13 return num1 + num2;
14 }
15
16 + (int)averageOfNum1: (int)num1 andNum2: (int)num2
17 {
18 //self在类方法中,它代表的是类Calculator
19 //self调用类方法
20 int s = [self sumOfNum1:(int)num1 andNum2:(int)num2];
21 return s/2;
22 }
23 @end
24
25 int main(int argc, const char * argv[])
26 {
27 int aver = [Calculator averageOfNum1:10 andNum2:30];
28 NSLog(@"平均值为%i",aver);
29 return 0;
30 }
(3)设计Car类,一个对象方法跟其他车子比较车速,返回速度差,一个类方法比较两辆车的车速,返回速度差
1 /*
2 设计Car类,一个对象方法跟其他车子比较车速,返回速度差,一个类方法比较两辆车的车速,返回速度差
3 */
4 #import <Foundation/Foundation.h>
5 @interface Car : NSObject
6 {
7 int _speed;
8 }
9 - (void)setSpeed:(int)speed;
10 - (int)speed;
11
12 - (int)compareSpeedWithOtherCar:(Car *)car2;
13 + (int)compareSpeedBetwwenCar1:(Car *)car1 andCar2: (Car *)car2;
14 @end
15
16 @implementation Car
17 - (void)setSpeed:(int)speed
18 {
19 _speed = speed;
20 }
21 - (int)speed
22 {
23 return _speed;
24 }
25
26 - (int)compareSpeedWithOtherCar:(Car *)car2
27 {
28 return _speed - car2 ->_speed;
29 }
30 + (int)compareSpeedBetwwenCar1:(Car *)car1 andCar2: (Car *)car2
31 {
32
33 return car1->_speed - car2 ->_speed;
34 }
35 @end
36
37 int main()
38 {
39 Car *car1 = [Car new];
40 Car *car2 = [Car new];
41 [car1 setSpeed:100];
42 [car2 setSpeed:120];
43 int s = [car2 compareSpeedWithOtherCar:car1];
44 int s1 = [Car compareSpeedBetwwenCar1:car1 andCar2: car2];
45 NSLog(@"对象方法:速度差为%i",s);
46 NSLog(@"类方法:速度差为%i",s1);
47 return 0;
48 }
人生之路,不忘初心,勿忘始终!