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 }
人生之路,不忘初心,勿忘始终!
原文地址:https://www.cnblogs.com/xdl745464047/p/3997976.html