ios - objective-c runtime之随笔

今天身体不舒服,还顶着写这篇博客。objective-c

举个例子,咱们以前在写objective-c代码时,常常用到id这个关键字。那 id 到底是什么?在objective-c的运行时,这样描述的,它实际上是一个结构体(struct)objc_objectapp

struct objc_object {
   Class isa;
};

Class到底是什么呢?其实它也是一个结构体,定义为以下:typedef struct objc_class *Class。函数

再如咱们常常用到SEL关键字,那它到底是什么呢?spa

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运行时注册)。字符串

平时,咱们常常定义不少方法,调用不少方法。那方法的定义是什么?get

typedef struct objc_method *Method;

在objective-c中,有些比较奇葩的关键字很容易跟C的关键字混淆。如 BOOL 关键字。它的定义以下:typedef signed char BOOL;噢,居然是一个不带符号的字符。那 YESNO 又是什么呢? 一看很无语,博客

#define YES (BOOL)1
#define NO (BOOL)0

objective - c 里,还有2个奇葩的关键字 nilNil。估计没几我的可以回答出这2个关键字的区别。先看看他们的定义吧。string

#define nil __DARWIN_NULL
#define Nil __DARWIN_NULL

从定义上看没有区别,但位置上却有区别。 nil 定义在 MacType.h, 表明是实例是空的。 Nil 定义在 objc/objc.h,  表明是空类。it

咱们在写objc代码时,免不了要定义不少属性。那属性在objc里面的定义是怎么样的?typedef struct objc_property *objc_property_t;io

它也是一个结构体...那咱们常用的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_getVersionclass_setVersion.

objc的函数调用实质是消息分发。

 在runtime,有2个API能够实现, 一个是 objc_msgSend (给一个类的实例发送信息),一个是objc_msgSendSuper (给它的超类发送一个信息)。

 今天先写这么多,后回分解!

相关文章
相关标签/搜索