今天身體不舒服,還頂着寫這篇博客。objective-c
舉個例子,咱們以前在寫objective-c代碼時,常常用到id這個關鍵字。那 id 到底是什麼?在objective-c的運行時,這樣描述的,它實際上是一個結構體(struct)objc_object。app
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;噢,居然是一個不帶符號的字符。那 YES 和 NO 又是什麼呢? 一看很無語,博客
#define YES (BOOL)1
#define NO (BOOL)0
objective - c 裏,還有2個奇葩的關鍵字 nil 和 Nil。估計沒幾我的可以回答出這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_getVersion和class_setVersion.
objc的函數調用實質是消息分發。
在runtime,有2個API能夠實現, 一個是 objc_msgSend (給一個類的實例發送信息),一個是objc_msgSendSuper (給它的超類發送一個信息)。
今天先寫這麼多,後回分解!