標籤:
1. Class 和 Object 的定義
/// An opaque type that represents an Objective-C class.typedef struct objc_class *Class;
/// Represents an instance of a class.struct objc_object { Class isa;}; /// A pointer to an instance of a class.typedef struct objc_object *id;
Class是一個指向objc_class結構體的指標,而id是一個指向objc_object結構體的指標,其成員isa是一個指向objec_class結構體的指標。
2. objc_class 的定義
struct objc_class { Class isa; // 指向metaclass Class super_class ; // 指向其父類 const char *name ; // 類名 long version ; // 類的版本資訊,初始化預設為0,可以通過runtime函數class_setVersion和class_getVersion進行修改、讀取
long info; // 一些標識資訊,如CLS_CLASS (0x1L) 表示該類為普通 class 其中包含對象方法和成員變數;CLS_META (0x2L) 表示該類為 metaclass,其中包含類方法; long instance_size ; // 該類的執行個體變數大小(包括從父類繼承下來的執行個體變數); struct objc_ivar_list *ivars; // 用於儲存每個成員變數的地址 struct objc_method_list **methodLists ; // 與 info 的一些標誌位有關,如CLS_CLASS (0x1L),則儲存物件方法,如CLS_META (0x2L),則儲存類方法; struct objc_cache *cache; // 指向最近使用的方法的指標,用於提升效率; struct objc_protocol_list *protocols; // 儲存該類遵守的協議 }isa:objec_object(對象)中isa指標指向的類結構稱為class(也就是該對象所屬的類),其中存放著普通成員變數與對象方法 (“-”開頭的方法);然而此處isa指標指向的類結構稱為metaclass,其中存放著static類型的成員變數與static類型的方法 (“+”開頭的方法)。
super_class: 指向該類的父類的指標,如果該類是根類(如NSObject或NSProxy),那麼super_class就為NULL。
可以通過runtime函數class_setVersion和class_getVersion進行修改、讀取 long info; // 一些標識資訊,如CLS_CLASS (0x1L) 表示該類為普通 class ,
ios 類的內部結構