A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© chunhuayun 中级黑马   /  2015-10-4 18:55  /  687 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1、self和super
这两个OC中的保留字,用于在方法定义中引用执行该方法的对象。OC中的self就相当于C++和Java中的this指针。
Super发送消息可以将方法实现分发给其父类。

2、self的应用场景
1)用在类方法中
2)用在对象方法中
3)访问成员变量
4)self在OC的内存管理特殊使用

3、self在对象方法中的使用
self指代调用当前方法的那个对象
例如:
  1. #import <Foundation/Foundation.h>

  2. #pragma mark Dog类声明定义部分
  3. @interface Dog: NSObject
  4. //跑完后吃东西
  5. -(void)run;
  6. //吃东西
  7. -(void)eat;
  8. @end

  9. @implementation Dog

  10. -(void)run{
  11.     NSLog(@"The dog is run...");
  12.     //显示self的地址
  13.     NSLog(@"self = %p",self);
  14.     //self在对象方法中可以调用其他对象方法
  15.     [self eat];
  16. }

  17. -(void)eat{
  18.     NSLog(@"The dog eat food...");
  19. }

  20. @end
  21. int main(int argc, const char * argv[])
  22. {

  23.     @autoreleasepool {
  24.         
  25.         Dog *dog = [Dog new];
  26.         //打印实例变量dog的地址
  27.         NSLog(@"dog = %p", dog);
  28.         
  29.         [dog run];
  30.     }
  31.     return 0;
  32. }
复制代码
打印结果:
2015-10-04 18:53:43.846 StaticDemo[1532:303] dog =0x100108ea0
2015-10-04 18:53:43.848 StaticDemo[1532:303] The dogis run...
2015-10-04 18:53:43.848 StaticDemo[1532:303] self =0x100108ea0
2015-10-04 18:53:43.848 StaticDemo[1532:303] The dogeat food...
分析结果:

由结果可知,self的地址跟dog的地址是相同的

4、self在类方法中的使用
self指代的是当前的类。此时self只能调用【类方法】
  1. #import <Foundation/Foundation.h>

  2. #pragma mark Dog类声明定义部分
  3. @interface Dog: NSObject
  4. //跑完后吃东西
  5. +(void)run;
  6. //吃东西
  7. +(void)eat;
  8. @end

  9. @implementation Dog

  10. +(void)run{
  11.     NSLog(@"The dog is run...");
  12.     //显示self的地址
  13.     NSLog(@"self = %p",self);
  14.     //self在对象方法中可以调用其他对象方法
  15.     [self eat];
  16. }

  17. +(void)eat{
  18.     NSLog(@"The dog eat food...");
  19. }

  20. @end
  21. int main(int argc, const char * argv[])
  22. {

  23.     @autoreleasepool {
  24.         
  25.         Dog *dog = [Dog new];
  26.         //打印实例变量dog的地址
  27.         NSLog(@"dog = %p", dog);
  28.         //打印Dog类的地址
  29.         NSLog(@"Dog = %p", [dog class]);
  30.         [Dog run];
  31.     }
  32.     return 0;
  33. }
复制代码


打印结果:
2015-10-04 18:51:20.647 StaticDemo[1505:303] dog =0x100108ee0
2015-10-04 18:51:20.649 StaticDemo[1505:303] Dog =0x100001200
2015-10-04 18:51:20.650 StaticDemo[1505:303] The dogis run...
2015-10-04 18:51:20.651 StaticDemo[1505:303] self =0x100001200
2015-10-04 18:51:20.651 StaticDemo[1505:303] The dogeat food...
分析结果:

由上述结果可知在类方法中使用的self的地址与调用方法的类的地址是相同的

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马