Objective - C基础: 第二天 - 6.关键字self的基本认识
在前面我们知道了实例方法, 类方法, 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] 一个人在跑步.
非常的简单, 我们就可以省略很多事情, 直接调用一个方法就可以了~~~
好了, 这次我们就讲到这里, 下次我们继续~~~

浙公网安备 33010602011771号