Objective - C基础: 第二天 - 6.关键字self的基本认识

来源:互联网 发布:公安网络布控 编辑:程序博客网 时间:2024/06/04 23:28

在前面我们知道了实例方法,类方法, 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);}@endint main(){    Preson *p = [Preson new];        [p setAge:20];        [p test];        return 0;}

输出的结果我们都知道:

Cain:2.第二天 Cain$ cc 07-self.m -framework FoundationCain: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 Foundation07-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 FoundationCain: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 FoundationCain: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(@"一个人在跑步.");}@endint 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(@"一个人在跑步.");}@endint main(){    Preson *p = [Preson new];        [p run];        return 0;}

输出的结果:

Cain:2.第二天 Cain$ cc 08-self.m -framework FoundationCain: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] 一个人在跑步.

非常的简单, 我们就可以省略很多事情, 直接调用一个方法就可以了~~~





好了, 这次我们就讲到这里, 下次我们继续~~~

0 0