zoukankan      html  css  js  c++  java
  • OC 中 self 与 super 总结

    一段代码引发的思考:

    @implementation Son : Father
    
    - (id)init
    {
        self = [super init];
        if (self) {
            NSLog(@"%@", NSStringFromClass([self class]));  //Son
            NSLog(@"%@", NSStringFromClass([super class]));  //Son
        }
        return self;
    }
    
    @end

    问题1:self 是什么 ?

    问题2:super 是什么 ?

    问题3:[super init] 到底做了什么 ?

    问题4:为什么把 [super init] 的地址赋值给 self ?

    问题5:为什么NSLog的输出都Son ?

    一、答案区

    答1:

      1> self 是 OC 提供保留字;

      2> self 代表着当前方法的调用者;

      3> 在 - 方法中,self代表着"对象";

      4> 在 + 方法中,self代表着"类";

      5> self 是方法的隐藏的参数变量,指向当前调用方法的对象,另一个隐藏参数是 _cmd,代表当前类方法的selector。

    答2:

      1> super 是 OC 提供保留字;

      2> super 不是隐藏的参数,它只是一个"编译器指示符"。查找方法时,指定方法查找的位置在父类。

    答3:

      1> 递归初始化父类对象,直到root对象;

     

    答4:

      1> 整个对象过程中只有一个对象 self ,不存在父类对象的指针;

      2> 对象内部不管是 self 还是 super 其消息主体只有一个就是 self ,也就是说 self 和 super 指向的是同一个对象;

      3> 在父类初始化失败的时候,返回nil,终止操作。

    答5:

      1> 参见 答4 ,结果显而易见,self 和 super是同一个实体。

    二、疑惑区

    解析:

      1> 面向对象过程中,子类继承父类,就拥有了父类所有的属性方法,一个完整的类的初始化包括子类初始化和父类初始化。

      2> 子类 [alloc init] 后,首先这里只有一个对象实体self,没有所谓的父类对象实体super。初始化过程中,父类属性、方法初始化都属于子类对象的一部分,super 的指针赋给 self 这一说法是错的,其实全部指的是该对象的初始位置。

    总结的过程中参考了以下链接:

    1. 关于 self 和 super 在 OC 中的疑惑与解析(帮助很大)

    2. self = [super init] 的学习

    3. self = [super init] 的思考

     

     

  • 相关阅读:
    LOJ#6501. 「雅礼集训 2018 Day4」Cube 题解
    LOJ#6510. 「雅礼集训 2018 Day8」A 题解
    LOJ#6513. 「雅礼集训 2018 Day10」足球大战 题解
    LOJ#6507. 「雅礼集训 2018 Day7」A 题解
    LOJ#6038. 「雅礼集训 2017 Day5」远行 题解
    Luogu P4208 [JSOI2008]最小生成树计数
    CodeForces 916D Jamie and To-do List
    CodeForces 573B Bear and Blocks
    CodeForces 460C Present
    CodeForces 786B Legacy
  • 原文地址:https://www.cnblogs.com/markstray/p/5611878.html
Copyright © 2011-2022 走看看