本文主要是介绍Object-C难以理解的一些概念,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.object-c 怎么实现多态 答:多态是在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实例的地址(具体的结构请参考The Objective-C Programming Language),然后比较方法的selector 如果找到了,就知道了method的地址,就直接调用了。 1,何为多态:不同对象可以访问相同方法的能力或现象。 2,多态的优势:不同的类对象可以使用习惯的调用方式;简化了编程接口;实现类和实例的接口隔离。 动态绑定,多态,在C++中主要是指基类指针,调用继承类所实现的虚方法。 在object C中,有比较新的展现形式。 (一)消息机制 oc中的消息机制就是一个动态绑定的过程, 每个类实例的第一个字段isa指针,指向类的结构体定义,里面有函数列表,缓存函数列表,协议列表,类名,实例参数列表,实例大小.....。 消息调用过程:编译过程中会在函数调用的代码处添加,obj_msgSend:函数调用;程序运行期,此函数完成动态绑定的所有过程。按照编译期改为obj_msgSend写时,填入的调用类,被调用者类,和他们的函数列表,找到对应的IMP即函数指针,完成函数调用。 objc_msgSend(receiver, selector, arg1, arg2, ...) 该消息函数做了动态绑定所需要的一切: 它首先找到选标所对应的方法实现。因为不同的类对同一方法可能会有不同的实现,所以找到的方法实现依赖于消息接收者的类型。 然后将消息接收者对象(指向消息接收者对象的指针)以及方法中指定的参数传给找到的方法实现。 最后,将方法实现的返回值作为该函数的返回值返回。 | |
这篇关于Object-C难以理解的一些概念的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!