为什么说 Objective-C 是一种动态语言?这看起来似乎是一个简单而不简约而又老生常谈的问题,然而真正弄懂 Objective-C 的动态特性,三言两语还真是说不清楚。
Objective-C 是 C 的超集,在 C 语言的基础上添加了面向对象的特性,并且用 Runtime 这个运行时机制,为 Objective-C 增添了动态的特性。这篇文章不以博大精深的 Runtime 作为重点,而以开发过程中的一些具体实例来诠释 Objective-C 的动态特性。下面分别以 Objective-C 多态的三个特性动态类型、动态绑定和动态加载来加以说明。
动态类型
即运行时再决定对象的类型。举个程序中的实例,即 id 类型,任何对象都可以被 id 指针所指,只有在运行时才能决定是什么类型。而静态类型在编译时就能确定是什么类型,如 int , NSString 等,若程序发生了类型不对应的问题,编译器就会发出警告。而动态类型在编译器编译的时候是不能被识别的,要等到运行时(run time)根据语境来识别确定。
总结为一点:动态类型和静态类型在时序的确定上是不同的,要分清运行时和编译时。
动态绑定
在 Objective-C 中,一个对象能否调用指定的方法不是由编译器决定而是由运行时决定,这被称作是方法的动态绑定。基于动态类型,在某个实例对象被确定后,其类型便被确定了。该对象对应的属性和响应的消息也被完全确定,比如我们一般向一个 NSObject 对象发送 -respondsToSelector: 消息来确定对象是否可以对某个 SEL 作出响应,而在 OC 消息转发机制被触发之前,对应的类的 +resolveClassMethod: 将会被调用,在此时有机会动态地向类或实例中添加新的方法,也就是说,类的实现是可以动态绑定的。
动态加载
让程序在运行时添加代码模块和资源,程序员可以根据需要执行一些可执行代码和资源,而不是在启东市就加载所有组件。举个非常通俗易懂的例子,开发的时候,需要为某种 icon 提供多个不同大小的图片,@2x,@3x,以保证设备更换的时候,图片也会自动地更换,这也体现了其动态加载的特性。
网上也有许多阐述 OC 动态特性的资源,但都偏向理论,本文以列举实例的方式更加清晰地解释了为什么说 Objective-C 是一种动态语言这个问题,简明易懂,欢迎一起学习探讨!