函数调用和给对象发消息(Runtime理解)
2020-01-15 11:52
501 查看
在写代码的时候这个差距其实是不打看的出得,很多时候也就无所谓叫什么,很多人为了便于理解,干脆就叫函数调用。
这个其实应该是oc的一个特色,消息发送。
具体的类
typedef struct objc_class *Class; typedef struct objc_object { Class isa; } *id; typedef struct objc_selector *SEL; typedef id (*IMP)(id, SEL, ...);
类结构
struct objc_class {
**struct** objc_class
**super_class; /*父类*/**
const char *name; **/***类名字*/
long version; ** /***版本信息*/
long info; **/***类信息*/
long instance_size; **/***实例大小*/
**struct** objc_ivar_list *ivars; ** /***实例参数链表*/
**struct** objc_method_list **methodLists; ** /*方法链表*/**
**struct** objc_cache *cache; **/***方法缓存*/
**struct** objc_protocol_list *protocols; ** /*协议链表*/**
};
在这个methodLists中是一个方法的list
typedef struct objc_method *Method;
typedef struct objc_ method {
**SEL method_name;//方法名称**
**char *method_types;//方法参数类型**
**IMP method_imp;//方法实现的函数指针**
};
当你发送消息时,首先回去找它对应的方法list,找到后就会使用相应的方法。
大致是这样的流程,当然细节也很多
1,它首先找到 SEL 对应的方法实现 IMP。因为不同的类对同一方法可能会有不同的实现,所以找到的方法实现依赖于消息接收者的类型。
2, 然后将消息接收者对象(指向消息接收者对象的指针)以及方法中指定的参数传递给方法实现 IMP。
3, 最后,将方法实现的返回值作为该函数的返回值返回。 starain Dou 豆电雨 文/natewang(简书作者)
原文链接:http://www.jianshu.com/p/ca70bfb142da
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
转载于:https://www.cnblogs.com/starainDou/p/5246350.html
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 面试题:为什么其他语言里叫函数调用,objective-c里则是给对象发消息(或者谈下对runtime的理解)
- 函数调用和给对象发消息(Runtime理解)
- ios 中调用函数的方法是消息传递,这个和普通的函数调用的区别是,你可以随时对一个对象传递任何消息,而不需要在编译的时候声明这些方法。所以Objective-C可以在runtime的时候
- [转]浅析C++中虚函数的调用及对象的内部布局(利用汇编深刻理解C++虚函数底层实现机制)
- [转]浅析C++中虚函数的调用及对象的内部布局(利用汇编深刻理解C++虚函数底层实现机制)
- 对C++中对象作为函数返回值时系统自动调用拷贝构造函数的理解
- [iphone 开发学习笔记]Object-C和C语言最大的区别也是最大的扩展-----消息(即如何调用一个对象中的函数)
- C++调用空指针对象的成员函数成功的理解
- 从汇编角度来理解linux下多层函数调用堆栈执行状态
- 87.直接向对象发送消息和通过performSelector调用的区别
- JNI 对象在函数调用中的生命周期
- php中引用&的真正理解-变量引用、函数引用、对象引用
- C++类对象内存模型与成员函数调用分析
- copy构造函数调用时机4,函数返回值是匿名对象
- 为什么Objective-C的对象“调用方法”叫做发消息。
- C++11 理解 (二十八) 之 用于计算函数对象返回类型的统一方法
- 深入理解JavaScript系列(4):立即调用的函数表达式
- 【javascript】函数调用的对象和方法
- C++类对象内存模型与成员函数调用分析(上)
- 调用操作符的重载与函数对象