Objective C Runtime的一些笔记

陶沛
2023-12-01

1. 相对于C/C++, Objective C尽可能地把一些动作推迟到运行时来执行。即尽可能动态地来做事情。 因此它不仅需要一个编译器,还需要一个运行时环境来执行编译后的代码。

2.Runtime分为Legacy和modern两个版本,一般来说,我们现在用的都是modern版本。

3.modern版本的一个显著特征就是“non-fraigle”, 即父类的成员变量发生改变时,子类不需要重新编译。

4.ObjC与runtime System在三个不同的层次进行交互:(1)通过ObjC源码  (2)通过NSObject定义的函数 (3)通过直接调用runtime functions。

5.Cocoa中大多数类都是NSObject的子类(NSProxy除外)。因此,在这个继承体系中,子类可以根据需求重新实现NSObject定义的一些函数,实现多态和动态性。比如description。

6.自省(introspection)

- (BOOL)isKindOfClass:(Class)aClass;
- (BOOL)isMemberOfClass:(Class)aClass;
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
+ (BOOL)instancesRespondToSelector:(SEL)aSelector;
+ (BOOL)conformsToProtocol:(Protocol *)protocol;
- (IMP)methodForSelector:(SEL)aSelector;
+ (IMP)instanceMethodForSelector:(SEL)aSelector;
- (void)doesNotRecognizeSelector:(SEL)aSelector;

7.Runtime System 是一个动态共享库,位于 /usr/include/objc, 拥有一套公共的接口。由一系列函数和数据结构组成。开发人员可用纯C来调用一些函数来做编译器做的事情。或者扩展Runtime System。为开发环境制作一些工具等。


8. 发消息是ObjC程序中最经常出现的表达式,而该表达式最终会被转化为objC_msgSend函数调用。

比如 [receiver message]  <->  objc_msgSend(receiver, selector)

如果由参数则为: objc_msgSend(receiver, selector, arg1, arg2, arg3, ...)
 类似资料: