美文网首页
Self关键字

Self关键字

作者: 草莓味辣妹 | 来源:发表于2019-03-21 16:43 被阅读0次

    Self关键字代表什么

    在实例方法中Self指代本类的实例对象。
    在类方法中Self指代类对象

    为什么可以在方法中使用self

    这里涉及到好几个runtime的知识点

    类方法和实例方法

    实例方法存储在类对象class结构中,类方法存储在元类中,实例方法只能由实例对象去调用,而类方法只能由类对象去调用
    一个方法的调用其实是给一个对象发送消息

    id objc_msgSend ( id self, SEL op, ... );
    

    当objc_msgSend找到方法对应的实现时,它将直接调用该方法实现,并将消息中所有的参数都传递给方法实现,同时,它还将传递两个隐藏的参数:
    接收消息的对象(也就是self指向的内容)
    方法选择器(_cmd指向的内容)

    一个方法的实现代码在运行时会转换成C++代码,会传入参数消息接受者id self 和方法名。
    因此当方法的调用者为实例对象时,传入的为实例对象(self指向实例对象);当方法的调用者为类对象时,传入的为类对象(self指向类对象)。
    这也是为什么实例方法中self指向实例对象,而类方法中self指向类对象
    self是指向本类的指针,是类的隐藏参数,指向当前调用方法的对象(类对象或者实例对象)
    通过self,可以在方法实现中访问消息接收者对象的实例变量。

    self = [super init];

    如果是[super init]的话,super会调用其父类的init,以此类推,直到找到根类NSObject中的init。然后根类中的init负责初始化内存区域,添加一些必要的属性,返回内存指针,延着继承链,指针从上到下进行传递,同时在不同的子类中可以向内存添加必要的属性。最后直到我们当前类中把内存地址赋值给self参数。当然,如果调用[super init]失败的话,通过判断self来决定是否执行子类的初始化操作。

    参考链接

    https://www.jianshu.com/p/9b36e1b636d8

    相关文章

      网友评论

          本文标题:Self关键字

          本文链接:https://www.haomeiwen.com/subject/bwjcvqtx.html