1. 为什么说Objective-C是一门动态的语言?
- 什么是动态语言?那相对的静态语言呢?
- 动态语言(Dynamic Programming Language -动态语言或动态编程语言),是指程序在运行时可以改变其结构。
- 动态类型语言(Dynamically Typed Language),所谓的动态类型语言,是指类型的检查是在运行时做的。
- 静态语言与静态类型语言与上述描述相反。
基于上述概念,可知
静态、动态是相对的,这里动态语言指的是不需要在编译时确定所有的东西(变量数据类型、方法和类),在运行时还可以动态的添加变量、方法和类
Objective-C 可以通过 Runtime 这个运行时机制,在运行时动态的添加变量、方法、类等,所以说Objective-C 是一门动态的语言。
我们知道 Objective-C 的运行时本质上是一个库。它负责了 “Objective” 这个部分,因此您所知、所爱的面向对象编程,都是在这里实现的。如果您想要访问里面的函数的话,只需要导入这个库即可:
#import <objc/runtime.h>
我们可能使用过或了解过很多该库相关的方法,例如:
- 给分类添加属性
objc_setAssociatedObject()
objc_getAssociatedObject()
- Method Swizzling
method_exchangeImplementations
动态继承、交换
我们可以在运行时创建新的class,这个特性用得不多,但其实它还是很强大的。你能通过它创建新的子类,并添加新的方法,如:Key Value Observing原理,isa指针的变换消息转发机制
forwardingTargetForSelector:
invokeWithTarget:
以上等等其实都都在说明,Objective-C 具有以下动态特性:
- 动态类型:
-即运行时再决定对象的类型
- 动态绑定:
-基于[动态类型],在某个实例对象被确定后,其类型便被确定了。该对象对应的属性和响应的消息也被完全确定,这就是动态绑定。
-[动态绑定]所做的,即是在实例所属类确定后,将某些属性和相应的方法绑定到实例上。这里所指的属性和方法当然包括了原来没有在类中实现的,而是在运行时才需要的新加入的实现
- 动态加载:
-根据需求加载所需要的资源,这点很容易理解,对于iOS开发来说,基本就是根据不同的机型做适配。最经典的例子就是在Retina设备上加载@2x的图片,而在老一些的普通屏设备上加载原图
同样将思考的点反过来以下,如果支持上述三个动态特性,那该语言属于动态类型语言吗?
基础尚算薄弱,还望有识之士能够补充一二,不胜感激!
ref
Objective-C 的运行时以及 Swift 的动态性
Objective-C 与 Runtime:为什么是这样?
深入Objective-C的动态特性
(译)Objective-C的动态特性
Objective-C是一门动态的语言?
[iOS 知识总结二] 为什么说Objective-C 是一门动态的语言
文/Jacob_LJ(简书作者)
PS:如非特别说明,所有文章均为原创作品,著作权归作者所有,转载需联系作者获得授权,并注明出处,所有打赏均归本人所有!