您所在的位置:小祥子 » 编程 » IOS » 正文

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

时间:2015-07-14 编辑:登山赏枫 来源:Cnblogs

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

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

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

4.代码

1.

 #import <Foundation/Foundation.h>
 
 @interface Person : NSObject
 {
     int _age;
 }
 
 - (void)setAge:(int)age;
 - (int)age;
 
 - (void)test;
 
 @end
 
 @implementation Person
 - (void)setAge:(int)age
 {
     // _age = age;
     self->_age = age;
 }
 - (int)age
 {
     return self->_age;
 }
 
 - (void)test
 {
     // self:指向了方向调用者,代表着当期对象
     int _age = 20;
     NSLog(@"Person的年龄是%d岁", self->_age);
 }
 
 @end
 
 int main()
 {
     Person *p = [Person new];
     
     [p setAge:10];
     
     [p test];
     
     return 0;
 }

2.

 #import <Foundation/Foundation.h>
 
 /*
  self的用途:
  1> 谁调用了当前方法,self就代表谁
  * self出现在对象方法中,self就代表对象
  * self出现在类方法中,self就代表类
  
  2> 在对象方法利用"self->成员变量名"访问当前对象内部的成员变量
  
  2> [self 方法名]可以调用其他对象方法\类方法
  */
 
 @interface Dog : NSObject
 - (void)bark;
 - (void)run;
 @end
 
 @implementation Dog
 - (void)bark
 {
     NSLog(@"汪汪汪");
 }
 - (void)run
 {
     [self bark];
     //NSLog(@"汪汪汪");
     NSLog(@"跑跑跑");
 }
 @end
 
 int main()
 {
     Dog *d = [Dog new];
     
     [d run];
     
     return 0;
 }

3.

 /*
  设计一个计算器类
  * 求和
  * 求平均值
  */
 
 #import <Foundation/Foundation.h>
 
 // 工具类:基本没有任何成员变量,里面的方法基本都是类方法
 @interface JiSusnQi : NSObject
 + (int)sumOfNum1:(int)num1 andNum2:(int)num2;
 
 + (int)averageOfNum1:(int)num1 andNum2:(int)num2;
 @end
 
 @implementation JiSusnQi
 + (int)sumOfNum1:(int)num1 andNum2:(int)num2
 {
     return num1 + num2;
 }
 
 + (int)averageOfNum1:(int)num1 andNum2:(int)num2
 {
     // 在这种情况下,self代表类
     int sum = [self sumOfNum1:num1 andNum2:num2];
     return sum / 2;
 }
 @end
 
 int main()
 {
     int a = [JiSusnQi averageOfNum1:10 andNum2:12];
     
     NSLog(@"a=%d", a);
     
 //    JiSusnQi *JSq = [JiSusnQi new];
 //    
 //    
 //    [jsq sumOfNum1:10 andNum2:13];
     
     return 0;
 }

4.使用注意

 #import <Foundation/Foundation.h>
 
 @interface Person : NSObject
 - (void)test;
 + (void)test;
 
 - (void)test1;
 + (void)test2;
 
 
 - (void)haha1;
 
 + (void)haha2;
 
 
 @end
 
 @implementation Person
 - (void)test
 {
     NSLog(@"调用了-test方法");
     
     // 会引发死循环
     //[self test];
 }
 
 + (void)test
 {
     NSLog(@"调用了+test方法");
     
     // 会引发死循环
     //[self test];
 }
 
 - (void)test1
 {
     [self test]; // -test
 }
 
 + (void)test2
 {
     [self test]; // +test
 }
 
 - (void)haha1
 {
     NSLog(@"haha1-----");
 }
 
 
 void haha3()
 {
     
 }
 
 + (void)haha2
 {
     // haha3();
     [self haha3];
     // [self haha1];
 }
 @end
 
 int main()
 {
     [Person haha2];
     //Person *p = [Person new];
     
     //[p test1];
     return 0;
 }
 
关键词:学习 笔记 关键字