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 (給它的超類發送一個信息)。

 今天先寫這麼多,後回分解!

相關文章
相關標籤/搜索