Objective-C是一門動態(tài)語言,為什么是動態(tài)語言,是因為Objective-C除了有自己的編譯器外,他還有一套系統(tǒng)來進行動態(tài)的創(chuàng)建類和對象以及消息的發(fā)送捡遍、傳遞,這套系統(tǒng)就是:runtime竹握。
首先画株,objc(以下Objective-C都用objc代替,我覺得大家也都懂的)雖然是Apple的程序的核心語言,Apple自己也是一個封閉的系統(tǒng)谓传,但是objc本身是一套開源的語言蜈项,想看他的源代碼,地址是:
我看的是objc4-647.tar.gz版本良拼,接下來,我來說說自己對于runtime的理解充边。
消息傳遞
我是做iOS開發(fā)的庸推,我們最常見到的方法調用就是下面這樣的:
[aFunc foo]; //aFunc為某類的一實例化對象,foo為該類中的一個方法浇冰。
這是一個很常見的方法調用的例子贬媒,但與靜態(tài)語言不同,使用這句方法時肘习,編譯器會把這句代碼轉化另外一句純C語言的方法际乘,在message.h
中有如下定義:
id objc_msgSend(id self, SEL op, ...);
根據這句方法,我們開始我們的runtime理解漂佩。
首先脖含,什么是id,在objc.h
中有如下定義:
/// A pointer to an instance of a class.
typedef struct objc_object *id;
可以看得出投蝉,id是一個指向objc_object
結構體的指針养葵,那么objc_object
是怎樣的?在objc.h
中有如下定義:
/// Represents an instance of a class.
struct objc_object {
Class isa OBJC_ISA_AVAILABILITY;
};
可以看出瘩缆,這個結構體中主要就是一個Class isa的成員关拒,這個成員指向了所屬的類。那么Class是怎么定義的呢庸娱?在objc.h
中有如下定義:
/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;
這樣就很明顯了着绊,Class是一個指向objc_class
結構體的指針,那么就到objc_class
了熟尉,這是在runtime.h
中的定義:
struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE;
const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
struct objc_cache *cache OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
#endif
}OBJC2_UNAVAILABLE;
通過OBJC2_UNAVAILABLE
可以看得出归露,objc2中這套定義已經不用了,我們先不說objc2中是怎樣的斤儿,我們先通過這套定義來管中窺豹靶擦。
isa是一個Class對象的Class,即:Meta Class雇毫。面向對象中玄捕,Class本身也是一個對象,因為在objc-runtime-new.h
中有如下定義:
struct objc_class : objc_object {
// Class ISA;
Class superclass;
cache_t cache; // formerly cache pointer and vtable
class_data_bits_t bits; // class_rw_t * plus custom rr/alloc flags
...
這里的objc_class
也是繼承于objc_object
棚放,所以枚粘,Class在設計上也是一個對象。
接下來的我閑了繼續(xù)寫飘蚯,開了好幾個坑了馍迄。福也。。