IOS self和super详解实现原理及区别
self和super区别
1、self调用自己方法,super调用父类方法
2、self是类,super是预编译指令
3、【selfclass】和【superclass】输出是一样的
self和super底层实现原理
1、当使用self调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找;而当使用super时,则从父类的方法列表中开始找,然后调用父类的这个方法。
2、当使用self调用时,会使用objc_msgSend函数:idobjc_msgSend(idtheReceiver,SELtheSelector,...)。第一个参数是消息接收者,第二个参数是调用的具体类方法的selector,后面是selector方法的可变参数。以[selfsetName:]为例,编译器会替换成调用objc_msgSend的函数调用,其中theReceiver是self,theSelector是@selector(setName:),这个selector是从当前self的class的方法列表开始找的setName,当找到后把对应的selector传递过去。
3、当使用super调用时,会使用objc_msgSendSuper函数:idobjc_msgSendSuper(structobjc_super*super,SELop,...)第一个参数是个objc_super的结构体,第二个参数还是类似上面的类方法的selector,
structobjc_super{ idreceiver; ClasssuperClass; };
当编译器遇到[supersetName:]时,开始做这几个事:
1)构建objc_super的结构体,此时这个结构体的第一个成员变量receiver就是子类,和self相同。而第二个成员变量superClass就是指父类调用objc_msgSendSuper的方法,将这个结构体和setName的sel传递过去。
2)函数里面在做的事情类似这样:从objc_super结构体指向的superClass的方法列表开始找setName的selector,找到后再以objc_super->receiver去调用这个selector
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!