Super 和 Self

我们都知道:self是类的隐藏参数,指向当前调用方法的这个类的实例。那 super 呢?
很多人会想当然的认为“super 和 self 类似,应该是指向父类的指针吧!”。这是很普遍的一个误区。其实 super 是一个 Magic Keyword,它本质是一个编译器标示符,和 self是指向的同一个消息接受者!他们两个的不同点在于:super 会告诉编译器,调用 class 这个方法时,要去父类的方法,而不是本类里的。

不管调用[selfclass]还是[super class],接受消息的对象都是当前的这个对象。
当使用 self调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找;而当使用 super 时,则从父类的方法列表中开始找。然后调用父类的这个方法。
这也就是为什么说“不推荐在init 方法中使用点语法”,如果想访问实例变量 iVar 应该使用下划线( _iVar ),而非点语法( self.iVar )。

点语法( self.iVar )的坏处就是子类有可能覆写 setter 。假设 Person 有一个子类叫ChenPerson,这个子类专门表示那些姓“陈”的人。该子类可能会覆写 lastName 属性所对应的设置方法.而重写后的方法优先级高于原本的方法优先级.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 我们都知道:self是类的隐藏参数,指向当前调用方法的这个类的实例。那 super 呢? 很多人会想当然的认为“s...
    sunmumu1222阅读 1,501评论 0 0
  • super和self相信大家每天都在和它们打交道,可能很多人都是按照套路来写,没怎么仔细思考过它们之间的关系,之...
    舒城8中阅读 3,846评论 0 1
  • super在类方法中, 一定会调用父类的类方法super在对象方法中, 一定会调用父类的对象方法可以利用super...
    imy博阅读 4,776评论 0 1
  • 一、说明 super:只是一个编译器指示符,并不是指针或者对象,它只是标识当前对象去调用父类的方法self: 实例...
    hylccmh阅读 4,247评论 0 2
  • 1.传统的js加载 在加载过程中,网页会停止渲染,进入等待,同时相互之间存在严格的依赖,如果1.js中要求的资源在...
    西元前__YP阅读 1,651评论 0 0