在前面我们知道了实例方法, 类方法, set方法, get方法, 现在我们来讲一个和OC普通关键字(因为OC的关键字都带"@"符号)不一样的self, 那什么是self呢??? 下面让我们一起来看看~~
先看一个例子:
#import <Foundation/Foundation.h> @interface Preson : NSObject { int _age; } - (void)setAge:(int)age; - (int)age; - (void)test; @end @implementation Preson - (void)setAge:(int)age { _age = age; } - (int)age { return _age; } - (void)test { NSLog(@"有一个%d岁在人在等车", _age); } @end int main() { Preson *p = [Preson new]; [p setAge:20]; [p test]; return 0; }
输出的结果我们都知道:
Cain:2.第二天 Cain$ cc 07-self.m -framework Foundation Cain:2.第二天 Cain$ ./a.out 2015-01-17 21:39:35.977 a.out[15770:1718617] 有一个20岁在人在等车
那如果改一下test方法呢???
- (void)test { int _age = 30; NSLog(@"有一个%d岁在人在等车", _age); }
输出的结果:
Cain:2.第二天 Cain$ cc 07-self.m -framework Foundation 07-self.m:26:45: warning: local declaration of '_age' hides instance variable [-Wshadow-ivar] NSLog(@"有一个%d岁在人在等车", _age); ^ 1 warning generated. Cain:2.第二天 Cain$ ./a.out 2015-01-17 21:47:24.067 a.out[15783:1720419] 有一个30岁在人在等车
虽然有警告, 但并不影响我们运行, 为什么会有这样子的结果呢? 不是设定的值是20么~~
其实这个和我们之前在C语言里面学过的一样, 就近原则, 一旦在比较近的同名实例变量, 就只会找最近的, 只有在里面没有同名的实例变量, 才会出去找.
那如果我只想访问main()函数里面的那个值, 不想要就近原则呢? 解决办法是有的, 让我们来看看~~
1. 使用第三方变量
- (void)test { int newAge = _age; int _age = 30; NSLog(@"有一个%d岁在人在等车", newAge); }
在修改之前把原来的值取出来, 赋给另外一个变量, 再打印出来, 结果就和我们想的一样:
Cain:2.第二天 Cain$ cc 07-self.m -framework Foundation Cain:2.第二天 Cain$ ./a.out 2015-01-17 21:51:02.652 a.out[15792:1721365] 有一个20岁在人在等车
2. 使用self关键字
- (void)test { int _age = 30; NSLog(@"有一个%d岁在人在等车", self->_age); }
输出的结果也和我们想要的是一致:
Cain:2.第二天 Cain$ cc 07-self.m -framework Foundation Cain:2.第二天 Cain$ ./a.out 2015-01-17 21:52:54.949 a.out[15799:1722160] 有一个20岁在人在等车
那么self到底是什么呢?
其实self是一个指针, 那么这个指针指的是谁呢? 在main()函数里, 谁调用, 那么self就指谁, 在我们这个例子里, 是p在调用test方法, 那么self就是指向p啦~~所以打印出来的结果和我们想要的是一致.
那么self除了这样子用, 还有没有其他用途呢? 其实是有的, 比如:
#import <Foundation/Foundation.h> @interface Preson : NSObject - (void)eat; - (void)run; @end @implementation Preson - (void)eat { NSLog(@"一个人在吃东西."); } - (void)run { NSLog(@"一个人在跑步."); } @end int main() { Preson *p = [Preson new]; [p eat]; [p run]; return 0; }
在之前, 我们如果要调用两个方法, 就必须这样子去调用, 但现在我们学了self, 那么就可以很省事了~~
#import <Foundation/Foundation.h> @interface Preson : NSObject - (void)eat; - (void)run; @end @implementation Preson - (void)eat { NSLog(@"一个人在吃东西."); } - (void)run { [self eat]; NSLog(@"一个人在跑步."); } @end int main() { Preson *p = [Preson new]; [p run]; return 0; }
输出的结果:
Cain:2.第二天 Cain$ cc 08-self.m -framework Foundation Cain:2.第二天 Cain$ ./a.out 2015-01-17 22:37:55.563 a.out[15910:1731906] 一个人在吃东西. 2015-01-17 22:37:55.565 a.out[15910:1731906] 一个人在跑步.
非常的简单, 我们就可以省略很多事情, 直接调用一个方法就可以了~~~
好了, 这次我们就讲到这里, 下次我们继续~~~