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、成员变量和局部变量同名
当成员变量和局部变量同名时,采取就近原则,访问的是局部变量;
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 }