OC在运行时对动态语言意味着什么?什么是动态识

2019-03-15 作者:小编   |   浏览(80)
动态:
主要原因是将数据类型确定从编译时延迟到运行时。
这个问题涉及两个概念:执行时间和多态。
简而言之,运行时机制允许您确定对象的类,直到运行时并调用该类对象的规范方法。
让我们考虑OC语言的动态特性。
OC的动态特性分为三个方面:动态类型,动态链接和动态负载。
它被称为动态,因为它需要在运行时运行。
(1)动态类型
动态类型,简单点是识别类型。
动态类型与静态类型有关。
显式基类型(如内置类型)是静态类型(int,NSString等)
可以在编译时识别静态类型。
因此,如果程序没有响应该类型,编译器将发出警告。
在编译器编译时无法识别动态类型,但必须等到运行时。也就是说,当程序运行时,根据上下文识别它。
因此,有两个概念要区分。编译时间和运行时间。
Idobj = someInstance;
是的([objisKindOfClass:someClass]){
someClass * classSpecifiedInstance =(someClass *)obj;
(2)动态链接
动态链接似乎很难记住,但它们实际上非常简单。记住关键字@ selector / SEL。
我们来看看这个功能。在其他静态语言(如C ++)中,被调用函数的签名通常在编译时传递给编译器。
静电,无法改变。
在OC中,实际上没有功能概念。我们称之为消息机制。所谓的函数调用是向对象发送消息。
此时,将显示动态链接功能。
OC最初跳过编译并在运行时动态添加对函数的调用。确定在运行时调用哪个方法以及要传递的参数。
这是一个动态链接。要实现它,您需要将方法与SEL变量链接。
生成的SEL变量表示对方法的引用。
这里要记住的一件事是SEL不是C函数指针。这非常相似,但不是函数指针。
SEL变量只是整数。这是方法ID,@ selector()是类方法编号。
前一个函数调用是根据函数名称(即字符串)查找函数体。
但现在我们正在寻找一种基于ID整数的方法。整数搜索术语比字符串搜索快得多。
因此,动态链接的特异性不仅方便而且更有效。
由于OC的动态特性,OC中很少提及功能的概念。传统函数通常在编译时将参数信息和函数实现分组为编译的源代码,并且最常用于OC,即消息机制。
调用实例方法时发生的情况是向实例指针发送消息。在收到消息后,实例会从其实现中查找对该消息的响应。
(3)动态负载
很容易理解如何根据您的要求加载所需的资源。在iOS开发的情况下,它基本上适用于各种型号。
最典型的例子是在Retina设备上加载@ 2x图像并将原始图像加载到旧的常规屏幕设备上。