Objective-C Is a Dynamic Language
, 那么对于Objective-C
的动态性可以从三个方面去了解:
-
Dynamic typing
,是指在判定该类的类型是在运行期间。 -
Dynamic binding
,是指在运行的时候确定调用方法 -
Dynamic loading
,是指在运行的时候可以添加一些方法,类和其他需要的模块。
1.动态类型
- 对于动态类型,
Objective-C
中的关键字id
,可以定义通用类型指针。 - 父类指针也可以指向子类的实例对象。在编译期指针类型为父类,运行后可判断为具体的某个子类。
-
NSArray * someArray = @"Hello, World!"
在编译期someArray
被认为NSArray
类型,运行后则为NSString
类型。也是动态类的体现。
2.动态绑定
在Objective-C
中,一个对象内否调用指定的方法不是由编译器决定而是由运行时决定。动态绑定是实现OC多态的基础,多态指的是不同对象对同一方法有着不同实现。
个人的理解,查找IMP的过程就是一个动态绑定的过程
3.动态加载
- 动态加载类,使用
objc_allocateClassPair``函数,添加要动态创建的类,用
objc_registerClassPair`函数注册这个类。 - 动态添加方法,实例变量等 :通过
class_addMethod
,class_addIvar
等动态添加方法,变量。 - 动态添加属性, 在分类(
category
)中添加属性,只会生成setter
和getter
,如想实现添加变量,需要使用对象关联。objc_getAssociatedObject()
和objc_setAssociateObject()