·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> 【学习笔记】【OC语言】self关键字

【学习笔记】【OC语言】self关键字

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23

1.成员变量和局部变量同名
当成员变量和局部变量同名时,采取就近原则,访问的是局部变量
用self访问成员变量,区分同名的局部变量

2.使用细节
出现的地方:所有的OC方法中(对象方法\类方法),不能出现在函数
作用
使用 "self->成员变量名" 访问当前方法调用的成员变量
使用 "[self 方法名];" 来调用方法(对象方法\类方法)

3.常见错误
低级错误:用self去调用函数
类方法中用self调用对象方法,对象方法中用self调用类方法
self死循环

4.代码

1.

 1 #import <Foundation/Foundation.h>
 2 
 3 @interface Person : NSObject
 4 {
 5     int _age;
 6 }
 7 
 8 - (void)setAge:(int)age;
 9 - (int)age;
10 
11 - (void)test;
12 
13 @end
14 
15 @implementation Person
16 - (void)setAge:(int)age
17 {
18     // _age = age;
19     self->_age = age;
20 }
21 - (int)age
22 {
23     return self->_age;
24 }
25 
26 - (void)test
27 {
28     // self:指向了方向调用者,代表着当期对象
29     int _age = 20;
30     NSLog(@"Person的年龄是%d岁", self->_age);
31 }
32 
33 @end
34 
35 int main()
36 {
37     Person *p = [Person new];
38     
39     [p setAge:10];
40     
41     [p test];
42     
43     return 0;
44 }

2.

 1 #import <Foundation/Foundation.h>
 2 
 3 /*
 4  self的用途:
 5  1> 谁调用了当前方法,self就代表谁
 6  * self出现在对象方法中,self就代表对象
 7  * self出现在类方法中,self就代表类
 8  
 9  2> 在对象方法利用"self->成员变量名"访问当前对象内部的成员变量
10  
11  2> [self 方法名]可以调用其他对象方法\类方法
12  */
13 
14 @interface Dog : NSObject
15 - (void)bark;
16 - (void)run;
17 @end
18 
19 @implementation Dog
20 - (void)bark
21 {
22     NSLog(@"汪汪汪");
23 }
24 - (void)run
25 {
26     [self bark];
27     //NSLog(@"汪汪汪");
28     NSLog(@"跑跑跑");
29 }
30 @end
31 
32 int main()
33 {
34     Dog *d = [Dog new];
35     
36     [d run];
37     
38     return 0;
39 }

3.

 1 /*
 2  设计一个计算器类
 3  * 求和
 4  * 求平均值
 5  */
 6 
 7 #import <Foundation/Foundation.h>
 8 
 9 // 工具类:基本没有任何成员变量,里面的方法基本都是类方法
10 @interface JiSusnQi : NSObject
11 + (int)sumOfNum1:(int)num1 andNum2:(int)num2;
12 
13 + (int)averageOfNum1:(int)num1 andNum2:(int)num2;
14 @end
15 
16 @implementation JiSusnQi
17 + (int)sumOfNum1:(int)num1 andNum2:(int)num2
18 {
19     return num1 + num2;
20 }
21 
22 + (int)averageOfNum1:(int)num1 andNum2:(int)num2
23 {
24     // 在这种情况下,self代表类
25     int sum = [self sumOfNum1:num1 andNum2:num2];
26     return sum / 2;
27 }
28 @end
29 
30 int main()
31 {
32     int a = [JiSusnQi averageOfNum1:10 andNum2:12];
33     
34     NSLog(@"a=%d", a);
35     
36 //    JiSusnQi *jsq = [JiSusnQi new];
37 //    
38 //    
39 //    [jsq sumOfNum1:10 andNum2:13];
40     
41     return 0;
42 }

4.使用注意

 1 #import <Foundation/Foundation.h>
 2 
 3 @interface Person : NSObject
 4 - (void)test;
 5 + (void)test;
 6 
 7 - (void)test1;
 8 + (void)test2;
 9 
10 
11 - (void)haha1;
12 
13 + (void)haha2;
14 
15 
16 @end
17 
18 @implementation Person
19 - (void)test
20 {
21     NSLog(@"调用了-test方法");
22     
23     // 会引发死循环
24     //[self test];
25 }
26 
27 + (void)test
28 {
29     NSLog(@"调用了+test方法");
30     
31     // 会引发死循环
32     //[self test];
33 }
34 
35 - (void)test1
36 {
37     [self test]; // -test
38 }
39 
40 + (void)test2
41 {
42     [self test]; // +test
43 }
44 
45 - (void)haha1
46 {
47     NSLog(@"haha1-----");
48 }
49 
50 
51 void haha3()
52 {
53     
54 }
55 
56 + (void)haha2
57 {
58     // haha3();
59     [self haha3];
60     // [self haha1];
61 }
62 @end
63 
64 int main()
65 {
66     [Person haha2];
67     //Person *p = [Person new];
68     
69     //[p test1];
70     return 0;
71 }