[OC]OC的动态特性

289 阅读2分钟

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类型
  1. NSObject包含了一些其他的方法,需要实现NSObject协议,可以用NSObject来表示id,但是不能用id来表示NSObject
  2. id关键字在编译的时候不会被检查,而NSObject在编译的时候被被检查是否含有一些错误的方法
  3. id可以是任何对象,包括不是NSObject的对象
  4. 定义id的时候不需要*,而定义NSOject的时候需要。
instancetype和id类型
  • 相同点: 他们都可以作为返回值
  • 不同点:
    1. instancetype不可以作为参数
    2. instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象
不要滥用id类型:

id类型的出现就是为了更好的承接动态类型与动态方法出来的返回值。

  • 如没有使用到多态尽量使用静态类型
  • 静态类型可以更早的发现错误(在编译阶段而不是运行阶段)
  • 静态类型能够提高程序的可读性
  • 使用动态类型前最好判断其真实类型

动态绑定(Dynamic binding)

https://zhuanlan.zhihu.com/p/272240505

动态加载(Dynamic loading)

根据需求加载所需要的资源

reference: