ios - objective-c runtime之随笔
今天身体不舒服,还顶着写这篇博客。
举个例子,我们之前在写objective-c代码时,经常用到id这个关键字。那 id 究竟是什么?在objective-c的运行时,这样描述的,它其实是一个结构体(struct)objc_object。
struct objc_object {
Class isa;
};
Class究竟是什么呢?其实它也是一个结构体,定义为如下:typedef struct objc_class *Class。
再如我们经常用到SEL关键字,那它究竟是什么呢?
typedef struct objc_selector *SEL;
A method selector is a C string that has been registered (or “mapped“) with the Objective-C runtime。意思是说一个方法的选择器是一个C的字符串(在objective-c运行时注册)。
平时,我们经常定义很多方法,调用很多方法。那方法的定义是什么?
typedef struct objc_method *Method;
在objective-c中,有些比较奇葩的关键字很容易跟C的关键字混淆。如 BOOL 关键字。它的定义如下:typedef signed char BOOL;噢,竟然是一个不带符号的字符。那 YES 和 NO 又是什么呢? 一看很无语,
#define YES (BOOL)1
#define NO (BOOL)0
objective - c 里,还有2个奇葩的关键字 nil 和 Nil。估计没几个人能够回答出这2个关键字的区别。先看看他们的定义吧。
#define nil __DARWIN_NULL #define Nil __DARWIN_NULL
从定义上看没有区别,但位置上却有区别。 nil 定义在 MacType.h, 代表是实例是空的。 Nil 定义在 objc/objc.h, 代表是空类。
我们在写objc代码时,免不了要定义很多属性。那属性在objc里面的定义是怎么样的?typedef struct objc_property *objc_property_t;
它也是一个结构体...那我们经常使用的retain,weak等关键字会是什么?会是一个结构体吗?答案:NO!它是一个枚举类型。
enum {
OBJC_ASSOCIATION_ASSIGN = 0,
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
OBJC_ASSOCIATION_RETAIN = 01401,
OBJC_ASSOCIATION_COPY = 01403
};
看到很无语.
那super又是什么呢?
struct objc_super { id receiver; Class class; };
结构体嵌套.... 我还有一个疑问,这么庞大的API,它靠什么样的机制区分开来。
我认真瞄了一下,它应该是有个版本号来管理的。因为它有class_getVersion和class_setVersion.
objc的函数调用实质是消息分发。
在runtime,有2个API可以实现, 一个是 objc_msgSend (给一个类的实例发送信息),一个是objc_msgSendSuper (给它的超类发送一个信息)。
今天先写这么多,后回分解!