OC 的动态特性包括三个方面:
- 动态类型(Dynamic typing)
首先了解一下什么是静态类型:
将一个变量定义为特定类的对象时,使用的是静态类型 动态类型是程序直到执行时才能确定所属的类, 如下所示
静态类型:一个指针指向的对象是本类对象, eg:
Animal *an = [[Animal alloc] init];
动态类型:一个指针所指向的对象不是本类对象, eg:
Animal *an = [[Dog alloc] init];
动态类型的检测方法:
+ (BOOL)isSubclassOfClass:(Class)aClass;
- (BOOL)isKindOfClass:(Class)aClass;
- (BOOL)isMemberOfClass:(Class)aClass;
NSObject和id类型
- NSObject包含了一些其他的方法,需要实现NSObject协议,可以用NSObject来表示id,但是不能用id来表示NSObject
- id关键字在编译的时候不会被检查,而NSObject在编译的时候被被检查是否含有一些错误的方法
- id可以是任何对象,包括不是NSObject的对象
- 定义id的时候不需要*,而定义NSOject的时候需要。
instancetype和id类型
- 相同点: 他们都可以作为返回值
- 不同点:
- instancetype不可以作为参数
- instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象
不要滥用id类型:
id类型的出现就是为了更好的承接动态类型与动态方法出来的返回值。
- 如没有使用到多态尽量使用静态类型
- 静态类型可以更早的发现错误(在编译阶段而不是运行阶段)
- 静态类型能够提高程序的可读性
- 使用动态类型前最好判断其真实类型
动态绑定(Dynamic binding)
https://zhuanlan.zhihu.com/p/272240505
动态加载(Dynamic loading)
根据需求加载所需要的资源