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
- Objective - C基础: 第二天 - 6.关键字self的基本认识
- Objective - C基础: 第二天 - 11.继承的关键字Super
- Objective - C基础: 第二天 - 7.self使用注意事项
- Objective-C self关键字
- 【Objective-C】self关键字
- Objective-C self关键字
- Objective - C基础: 第三天 - 1.NSString的基本认识
- Objective - C基础: 第五天 - 1.计数器的基本认识
- Objective - C基础: 第五天 - 7.autorelease的基本认识
- Objective - C基础: 第二天 - 4.类方法的简单认识
- 【Objective-C】08-self关键字
- 【Objective-C】08-self关键字
- Objective-C类-Objective-C self 关键字
- Objective - C基础: 第四天 - 1.id类型的基本认识
- Objective - C基础: 第四天 - 4.类别的基本认识之一
- Objective - C基础: 第四天 - 5.类别的基本认识之二
- Objective - C基础: 第四天 - 10.SEL类型的基本认识
- Objective - C基础: 第六天 - 1.ARC自动引用计数的基本认识
- vs.php中使用apache或IIS7进行外部调试
- Longest Consecutive Sequence 递归实现
- 关于spring下载源码的一点吐槽
- ARM Program Status Register 和 相关指令之笔记
- OC 自带方法 简绍 2 NSMutableString
- Objective - C基础: 第二天 - 6.关键字self的基本认识
- 总结:One weird trick for parallelizing convolutional neural networks
- 求数据类型所占字节和取值范围
- Android 应用的兼容性
- 【NumPy基础】100道numpy练习——Apprentice篇
- java--String 类用法
- 真正完美解决vs2008 添加启动画面(基于对话框)
- 对递归的新认识
- 方差分析