iOS Class結構分析
阿新 • • 發佈:2019-01-30
類在objective-C中是objc_class 結構體指標
typedef struct objc_class *Class;
在objc/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; 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;
isa: 指向元類的objc_class結構體指標,iOS中的類也是物件,元類中儲存有類物件的類方法;
superclass: 指向父類的objc_class結構體指標,可以通過父類的指標找到變數和方法;
name:類名;
version:版本號,預設為0
info:其他資訊,執行期間的一些位標示
instance_size:類例項變數大小
ivars:該類的成員變數連結串列,是objc_ivar_list結構體指標,
struct objc_ivar_list { int ivar_count; /* variable length structure */ struct objc_ivar ivar_list[1]; }
objc_var:變數結構體---名稱,型別,偏移位元組和佔用的空間
objc_method_list: 方法連結串列結構體struct objc_ivar { char *ivar_name OBJC2_UNAVAILABLE; char *ivar_type OBJC2_UNAVAILABLE; int ivar_offset OBJC2_UNAVAILABLE; #ifdef __LP64__ int space OBJC2_UNAVAILABLE; #endif }
struct objc_method_list {
struct objc_method_list *obsolete OBJC2_UNAVAILABLE;
int method_count OBJC2_UNAVAILABLE;
#ifdef __LP64__
int space OBJC2_UNAVAILABLE;
#endif
/* variable length structure */
struct objc_method method_list[1] OBJC2_UNAVAILABLE;
}
method: 物件的每個方法的結構體,SEL是方法選擇器,是HASH後的值,可以通過這個值找到函式體的實現,IMP 是函式指標
struct objc_method {
SEL method_name OBJC2_UNAVAILABLE;
char *method_types OBJC2_UNAVAILABLE;
IMP method_imp OBJC2_UNAVAILABLE;
}
cache: 物件使用過的方法連結串列,struct objc_cache {
unsigned int mask /* total = mask + 1 */ OBJC2_UNAVAILABLE;
unsigned int occupied OBJC2_UNAVAILABLE;
Method buckets[1] OBJC2_UNAVAILABLE;
};
protocols:協議連結串列struct objc_protocol_list {
struct objc_protocol_list *next;
long count;
Protocol *list[1];
};