A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kingloveyy 中级黑马   /  2014-9-25 22:32  /  1283 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

      多态是在runtime里面实现的,在编译的时候,compiler把所有class的定义都存放在class 实例对象里面,class实例对象包含了class的父class 实例对象的地址,class方法的select id和地址, class变量的偏移等。所有new出来的object都是从NSObject继承过来的,所以所有对象都自动包含了一个isa的指针,这个指针在调用alloc为object分配地址的时候被指向class对象的地址,在运行的时候,我们调用class 方法是通过给object发送消息[myobj method]这样的形式,但编译器会把这句话替换成id objc_msgSend(id theReceiver, SEL theSelector, ...)  第一个参数就是myobj,第二个参数是“method”这个字符串经过编码以后得到的唯一值,apple在runtime的时候查找method都是用selector来做的,这样效率会比字符串比较的效率要高。objc_msgSend这个函数的执行过程大概就是,从thereceiver(也就是myobj)里面得到isa的地址,这个地址指向前面讲到的编译器生成的class的object实例的地,然后比较方法的selector如果找到了,就知道了method的地址,就直接调用了。

1 个回复

正序浏览
OC中的多台体现有哪些啊?能举例说明下不
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马