對象的代碼塊
typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;
Objective-C的對象就是一個(gè)包含isa指針的數(shù)據(jù)結(jié)構(gòu),而isa又是一個(gè)Class類型的誉己,Class則是一個(gè)名為objc_class的數(shù)據(jù)結(jié)構(gòu)定義睦霎。
runtime.h中對objc_class的定義:
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;
// 類實(shí)例變量大小
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;
// 類協(xié)議列表
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;
作者:iEzreal
鏈接:http://www.reibang.com/p/7edece26de7f
isa:在Objective-C中塌计,類自身也是一個(gè)對象弄捕,這個(gè)對象的isa指針指向metaClass(元類)
super_class:指向該類的父類韵丑,如果該類已經(jīng)是最頂層的根類(如NSObject或NSProxy)爵卒,則super_class為NULL。
cache:用于緩存最近使用的方法撵彻。一個(gè)接收者對象接收到一個(gè)消息時(shí)钓株,它會根據(jù)isa指針去查找能夠響應(yīng)這個(gè)消息的對象。在實(shí)際使用中陌僵,這個(gè)對象只有一部分方法是常用的轴合,很多方法其實(shí)很少用或者根本用不上。這種情況下碗短,如果每次消息來時(shí)受葛,我們都是methodLists中遍歷一遍,性能勢必很差偎谁。這時(shí)总滩,cache就派上用場了。在我們每次調(diào)用過一個(gè)方法后巡雨,這個(gè)方法就會被緩存到cache列表中闰渔,下次調(diào)用的時(shí)候runtime就會優(yōu)先去cache中查找,如果cache沒有鸯隅,才去methodLists中查找方法澜建。這樣,對于那些經(jīng)常用到的方法的調(diào)用蝌以,但提高了調(diào)用的效率炕舵。
version:我們可以使用這個(gè)字段來提供類的版本信息。這對于對象的序列化非常有用跟畅,它可是讓我們識別出不同類定義版本中實(shí)例變量布局的改變咽筋。
元類(Meta Class)
元類存儲著一個(gè)類的所有類方法,當(dāng)我們向一個(gè)對象發(fā)送消息時(shí)徊件,runtime會在這個(gè)對象所屬的這個(gè)類的方法列表中查找方法奸攻;而向一個(gè)類發(fā)送消息時(shí),會在這個(gè)類的meta-class的方法列表中查找虱痕。