zoukankan      html  css  js  c++  java
  • OC self super isa指针

    self指针:

    1. self是oc面向对象设计中的一个特殊指针,相当于java中的this,但是比this强大,this只能访问实例对象的相关方法和成员变量,或者说this只代表实例对象;
    2. self不仅可以代表实例对象,还可以代表类对象;谁调用当前方法,self就代表谁;如果self用在了以"-"号的方法中,也就是对象方法中,那么就代表实例对象,若果在"+"号开头的方法中,self就代表类对象,因为只有类对象才能调用以"+"号开头的方法;
    3. self调用成员变量:self->age; 调用方法:[self test]; // age是成员变量,test是方法;
    4. 但是self如果调用的不得当,会引起死循环:
      - (void) test
      {
            NSLog(@"hahha");
            [self test]; // 首先这个self肯定是实例对象,这样调用会引发死循环;  
      }

    super指针:

    1. 和self差不多,只不过它是调用的当前类的父类的方法,不管是类方法还是对象方法;
    2. 如果super处在当前类的类方法中,就会调用父类的类方法; 如果super处在当前类的对象方法中,就会调用父类的对象方法;
    3. 使用场景:子类如果想覆盖父类的某个方法,且只是对父类方法的延伸,在父类的基础上增加功能,那么在重写的方法中就先用super调用父类的方法;
      #import <Foundation/Foundation.h>
      // 父类Person类
      @interface Person : NSObject
      
      // 为了方便说明问题,定义两个同名方法,一个是类方法,一个是对象方法,walk方法是要被子类覆盖的;
      - (void)test;
      + (void)test;
      
      - (void)walk;
      @end
      
      @implementation Person
      - (void)test
      {
          NSLog(@"对象方法-test");
      }
      
      + (void)test
      {
          NSLog(@"类方法-test");
      }
      
      - (void)walk
      {
          NSLog(@"walk");
      }
      @end
      
      // 子类 Boy
      @interface Boy : Person
      
      - (void)haha;
      + (void)haha1;
      
      - (void)walk;
      @end
      @implementation Boy
      - (void)haha
      {
          [super test]; // 在对象方法中调用super,调用的时父类的对象方法test
      }
      
      + (void)haha1
      {
          [super test]; // 在类方法中调用super,调用的时父类的类方法test
      
      }
      
      - (void)walk
      {
          [super walk]; // 掉用父类的walk方法
          NSLog(@"run");
      }
      @end
      
      int main()
      {
          Boy *b = [Boy new];
          [b haha];  // 在对象方法中调用super,调用的时父类的对象方法test,输出 -test
      
          [Boy test]; // 在对象方法中调用super,调用的时父类的对象方法test,输出 +test
      
          return 0;
      }

    isa指针是每个对象内部自动生成,指向类对象的指针;

  • 相关阅读:
    Linux的inode的理解
    linux中ctrl+z和ctrl+c的区别
    linux后台运行和关闭、查看后台任务
    解决Could not get lock /var/cache/apt/archives/lock
    Spring Boot 2.1.5 正式发布,1.5.x 即将结束使命!
    【免费】某平台16980元编程课程资料下载,仅此1次
    秒杀系统架构分析与实战,一文带你搞懂秒杀架构!
    阿里数据库大牛的 MySQL 学习指南!
    Intellij IDEA 撸码最头大的问题。。
    Java 中的 SPI 机制是什么鬼?高级 Java 必须掌握!
  • 原文地址:https://www.cnblogs.com/cxbblog/p/3719934.html
Copyright © 2011-2022 走看看