obj-c编程01[扩展学习01]:对象消息机制工作原理
2014-07-04 18:28
309 查看
obj-c中的类就像C语言中的struct。NSObject类声明一个成员变量isa,因为NSObject类是整个继承树的根,所以每个类中都有一个isa其指向创建的对象。在类结构中有实例变量(成员变量)和其类型以及类中方法的实现,并且每个类都有一个指针指向其父类:
类中的方法通过选择器(selector)索引,选择器是SEL类型。类中每一个方法名字都映射成一个唯一的int值,例如方法addObject可能映射成整数12.作为obj-c数据结构的一部分,存在一个表,它将方法的名字映射到它们的选择器内,如下图:
在编译时,只要有消息产生编译器就查找选择器类来寻找方法,因此代码:
[ary addObject:obj_a];
被转换为(假设选择器映射表中addObject值为12)如下形式:
objc_msgsend(ary,12,obj_a);
在这里,objc_msgsend函数使用ary对象中的isa指针获得它的类结构,查找值与12相关联的函数。如果没有找到函数,则可以追踪指针至其父类。然后依次到父类的父类等等,最后到达树的顶端,如果此时仍然没有发现该函数,则抛出一个异常。
类中的方法通过选择器(selector)索引,选择器是SEL类型。类中每一个方法名字都映射成一个唯一的int值,例如方法addObject可能映射成整数12.作为obj-c数据结构的一部分,存在一个表,它将方法的名字映射到它们的选择器内,如下图:
在编译时,只要有消息产生编译器就查找选择器类来寻找方法,因此代码:
[ary addObject:obj_a];
被转换为(假设选择器映射表中addObject值为12)如下形式:
objc_msgsend(ary,12,obj_a);
在这里,objc_msgsend函数使用ary对象中的isa指针获得它的类结构,查找值与12相关联的函数。如果没有找到函数,则可以追踪指针至其父类。然后依次到父类的父类等等,最后到达树的顶端,如果此时仍然没有发现该函数,则抛出一个异常。
相关文章推荐
- obj-c编程01[扩展学习01]:对象消息机制工作原理
- obj-c编程01[扩展学习01]:对象消息机制工作原理
- obj-c编程01:第一个类和对象的范例
- python核心编程学习笔记-2016-09-25-01-python扩展
- obj-c编程01:第一个类和对象的范例
- Thinking in Java [Java编程机制] 学习笔记 -- 变量和对象
- C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理
- objc_msgSend消息传递学习笔记 – 对象方法消息传递流程
- Android学习五 网络编程与handler消息机制
- obj-c编程01:第一个类和对象的范例
- [iphone 开发学习笔记]Object-C和C语言最大的区别也是最大的扩展-----消息(即如何调用一个对象中的函数)
- Servlet 与 Jsp核心编程 卷一 学习笔记 01
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】深入剖析Linux中断机制之二--Linux中断的组织形式
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】深入剖析Linux内核定时器实现机制
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】深入剖析Linux中断机制之四--中断API
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】深入剖析Linux中断机制之三--Linux对异常和中断的处理
- asp.net ajax 学习笔记--对javascript对象的扩展
- MFC的消息机制学习
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】全面解析Linux内核的同步与互斥机制--互斥篇
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】Linux系统调用的实现机制分析