看到126节的小结:
- (见视频126)目前出现了第二个调方法没有走objc_msgSend(id reciever, sel imd)的方法(上一个是+load方法,完全没有走消息机制,具体见前面的内容),那就是[super XXXX],他走的方法是objc_msgSendSuper方法,而且与objc_msgSend带的参数也不一样,objc_msgSendSuper的参数是(struct a, sel imd),a这里是一个结构体:struct a{self, [self superclass]},其中第一个参数self是消息的接收者,第二个参数是接收者的父类,objc_msgSendSuper的意思就是从[self superclass]的内存方法列表开始去寻找方法(如图)
但是!!!与以往不同的是,这里生成的cpp文件上显示的是objc_msgSendSuper,实际上真正运行的时候打断点用汇编查看到的却是objc_msgSendSuper2方法,而且第一个参数结构体的第二个参数是[class [current class]] (见视频127)
由上可见,转成的cpp的实现其实只是参考,但是大部分都是正确的,要看最正确的执行过程就需要看转成的汇编代码
- 函数的局部变量存于栈中,而且是从高到低,与堆上从低到高相反
- runtime添加成员变量只能在新添加的类注册之前,也就是说成员变量是只读的,而属性、方法不受此限制
网友评论