iOS面试iOS开发

OC语言的动态性

2018-07-29  本文已影响60人  小凡凡520
概念

Objective-C 是面相运行时的语言,它会尽可能的把编译和链接时要执行的逻辑延迟到运行时。使用Runtime可以按需要把消息重定向给合适的对象,交换方法的实现等等。

Runtime简称运行时,其中最主要的是消息机制,是一个主要使用 C 和汇编写的库,为 C 添加了面相对象的能力并创造了 Objective-C。。OC的函数调用称为消息发送。属于动态调用过程。在编译的时候并不能决定真正调用哪个函数(在编 译阶段,OC可以调用任何函数,即使这个函数并未实现,只要声明过就不会报错。而C语言在编译阶段就会报错)。只有在真正运行的时候才会根据函数的名称找 到对应的函数来调用。

消息的传递
[obj makeText];
==》
objc_msgSend(obj,@selector(makeText));

编译器执行上述转换。在objc_msgSend函数中,首先通过obj的isa指针找到obj对应的class。每个对象内部都默认有一个isa指针指向这个对象所使用的类。isa是对象中的隐藏指针,指向创建这个对象的类。在Class中先去cache中通过SEL查找对应函数method(cache中method列表是以SEL为key通过hash表来存储的,这样能提高函数查找速度),若cache中未找到,再去methodList中查找,若methodlist中未找到,则取superClass中查找。若能找到,则将method加入到cache中,以方便下次查找,并通过method中的函数指针跳转到对应的函数中去执行。

动态的体现

OC的动态特性表现为了三个方面:动态类型、动态绑定、动态加载。之所以叫做动态,是因为必须到运行时(runtime)才会做一些事情。

动态语言和静态语言的一个区别是静态语言提前编译好文件,即所有的逻辑已在编译时确定,运行时直接加载编译后的文件;而动态语言是在运行时才确定实现。典型的静态语言是C++,动态语言包括OC,JAVA,C#等;因为静态语言提前编译好了执行文件,也就是通常所说的静态语言效率较高的原因

1、为 class pair分配存储空间 ,使用 objc_allocateClassPair函数 2、增加需要的方法使用class_addMethod函数,增加实例变量用class_addIvar 3 、用objc_registerClassPair函数注册这个类,以便它能被别人使用。

上一篇 下一篇

猜你喜欢

热点阅读