基础问题篇-1. 为什么说Objective-C是一门动态的语言?

1. 为什么说Objective-C是一门动态的语言?

  • 什么是动态语言?那相对的静态语言呢?
    • 动态语言(Dynamic Programming Language -动态语言或动态编程语言),是指程序在运行时可以改变其结构
    • 动态类型语言(Dynamically Typed Language),所谓的动态类型语言,是指类型的检查是在运行时做的。
    • 静态语言与静态类型语言与上述描述相反。

基于上述概念,可知

静态、动态是相对的,这里动态语言指的是不需要在编译时确定所有的东西(变量数据类型、方法和类),在运行时还可以动态的添加变量、方法和类

Objective-C 可以通过 Runtime 这个运行时机制,在运行时动态的添加变量、方法、类等,所以说Objective-C 是一门动态的语言。

我们知道 Objective-C 的运行时本质上是一个库。它负责了 “Objective” 这个部分,因此您所知、所爱的面向对象编程,都是在这里实现的。如果您想要访问里面的函数的话,只需要导入这个库即可:

#import 

我们可能使用过或了解过很多该库相关的方法,例如:

  • 给分类添加属性
objc_setAssociatedObject()
objc_getAssociatedObject()
  • Method Swizzling
method_exchangeImplementations
  • 动态继承、交换
    我们可以在运行时创建新的class,这个特性用得不多,但其实它还是很强大的。你能通过它创建新的子类,并添加新的方法,如:Key Value Observing原理,isa指针的变换

  • 消息转发机制

forwardingTargetForSelector:
invokeWithTarget:

以上等等其实都都在说明,Objective-C 具有以下动态特性:

  1. 动态类型:
    - 即运行时再决定对象的类型
  1. 动态绑定:
    - 基于[动态类型],在某个实例对象被确定后,其类型便被确定了。该对象对应的属性和响应的消息也被完全确定,这就是动态绑定。
    - [动态绑定]所做的,即是在实例所属类确定后,将某些属性和相应的方法绑定到实例上。这里所指的属性和方法当然包括了原来没有在类中实现的,而是在运行时才需要的新加入的实现
  1. 动态加载:
    - 根据需求加载所需要的资源,这点很容易理解,对于iOS开发来说,基本就是根据不同的机型做适配。最经典的例子就是在Retina设备上加载@2x的图片,而在老一些的普通屏设备上加载原图

同样将思考的点反过来以下,如果支持上述三个动态特性,那该语言属于动态类型语言吗?

基础尚算薄弱,还望有识之士能够补充一二,不胜感激!

ref

Objective-C 的运行时以及 Swift 的动态性
Objective-C 与 Runtime:为什么是这样?
深入Objective-C的动态特性
(译)Objective-C的动态特性
Objective-C是一门动态的语言?
[iOS 知识总结二] 为什么说Objective-C 是一门动态的语言


文/Jacob_LJ(作者)
PS:如非特别说明,所有文章均为原创作品,著作权归作者所有,转载需联系作者获得授权,并注明出处,所有打赏均归本人所有!

你可能感兴趣的:(基础问题篇-1. 为什么说Objective-C是一门动态的语言?)