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;噢,竟然是一个不带符号的字符。那 YESNO 又是什么呢? 一看很无语,

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

objective - c 里,还有2个奇葩的关键字 nilNil。估计没几个人能够回答出这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_getVersionclass_setVersion.

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

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

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

ios - objective-c runtime之随笔,布布扣,bubuko.com

ios - objective-c runtime之随笔

上一篇:微信朋友圈自动点赞


下一篇:weui-wxss框架实现博远企信小程序