Objective-C語言是一門動態語言,它將不少靜態語言在編譯和連接時期作的事放到了運行時來處理。這種動態語言的優點在於:具備靈活性,好比:消息轉發,方法交換等。它有一個運行時系統Objc Runtime,實際上是一個Runtime庫,基本上是用C和彙編寫的,這個庫使得C語言有了面向對象的能力。數組
typedef struct objc_class *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; // 類的版本信息,默認爲0 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;
typedef struct objc_object *id; struct objc_object { Class isa OBJC_ISA_AVAILABILITY; };
typedef struct objc_cache *cache; struct objc_cache { unsigned int mask /* total = mask + 1 */ OBJC2_UNAVAILABLE; unsigned int occupied OBJC2_UNAVAILABLE; Method buckets[1] OBJC2_UNAVAILABLE; };
咱們都知道,實例對象擁有一個指向所屬類的isa指針。那類自己也能夠當作是所屬類的對象,即類對象那它天然也擁有一個指向所屬類的isa指針,這個指針指向的也是該類對象的所屬類,即元類。因此,當咱們向一個對象發送消息時,runtime會在這個對象所屬的這個類的方法列表中查找方法;而向一個類發送消息時,會在這個類的所屬類,即元類meta-class的方法列表中查找。緩存
NSArray *array = [[NSArray alloc] init];
// 獲取類的父類 Class class_getSuperclass ( Class cls ); // 判斷給定的Class是不是一個元類 BOOL class_isMetaClass ( Class cls );
// 獲取類的類名 const char * class_getName ( Class cls );
// 獲取實例大小 size_t class_getInstanceSize ( Class cls );
// 獲取版本號 int class_getVersion ( Class cls ); // 設置版本號 void class_setVersion ( Class cls, int version );
/** 成員變量操做函數 */
// 獲取類中指定名稱實例成員變量的信息 Ivar class_getInstanceVariable ( Class cls, const char *name ); // 獲取類成員變量的信息 Ivar class_getClassVariable ( Class cls, const char *name ); // 添加成員變量 BOOL class_addIvar ( Class cls, const char *name, size_t size, uint8_t alignment, const char *types ); // 獲取整個成員變量列表 Ivar * class_copyIvarList ( Class cls, unsigned int *outCount );
/** 屬性操做函數 */ // 獲取指定的屬性 objc_property_t class_getProperty ( Class cls, const char *name ); // 獲取屬性列表 objc_property_t * class_copyPropertyList ( Class cls, unsigned int *outCount ); // 爲類添加屬性 BOOL class_addProperty ( Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount ); // 替換類的屬性 void class_replaceProperty ( Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount );
// 添加方法 BOOL class_addMethod ( Class cls, SEL name, IMP imp, const char *types ); // 獲取實例方法 Method class_getInstanceMethod ( Class cls, SEL name ); // 獲取類方法 Method class_getClassMethod ( Class cls, SEL name ); // 獲取全部方法的數組 Method * class_copyMethodList ( Class cls, unsigned int *outCount ); // 替代方法的實現 IMP class_replaceMethod ( Class cls, SEL name, IMP imp, const char *types ); // 返回方法的具體實現 IMP class_getMethodImplementation ( Class cls, SEL name ); IMP class_getMethodImplementation_stret ( Class cls, SEL name ); // 類實例是否響應指定的selector BOOL class_respondsToSelector ( Class cls, SEL sel );
// 添加協議 BOOL class_addProtocol ( Class cls, Protocol *protocol ); // 返回類是否實現指定的協議 BOOL class_conformsToProtocol ( Class cls, Protocol *protocol ); // 返回類實現的協議列表 Protocol * class_copyProtocolList ( Class cls, unsigned int *outCount );
// 返回指定對象的一份拷貝 id object_copy ( id obj, size_t size ); // 釋放指定對象佔用的內存 id object_dispose ( id obj );
// 修改類實例的實例變量的值 Ivar object_setInstanceVariable ( id obj, const char *name, void *value ); // 獲取對象實例變量的值 Ivar object_getInstanceVariable ( id obj, const char *name, void **outValue ); // 返回指向給定對象分配的任何額外字節的指針 void * object_getIndexedIvars ( id obj ); // 返回對象中實例變量的值 id object_getIvar ( id obj, Ivar ivar ); // 設置對象中實例變量的值 void object_setIvar ( id obj, Ivar ivar, id value );
// 返回給定對象的類名 const char * object_getClassName ( id obj ); // 返回對象的類 Class object_getClass ( id obj ); // 設置對象的類 Class object_setClass ( id obj, Class cls );
// 建立一個新類和元類 Class objc_allocateClassPair ( Class superclass, const char *name, size_t extraBytes ); // 銷燬一個類及其相關聯的類 void objc_disposeClassPair ( Class cls ); // 在應用中註冊由objc_allocateClassPair建立的類 void objc_registerClassPair ( Class cls );
// 建立類實例 id class_createInstance ( Class cls, size_t extraBytes ); // 在指定位置建立類實例 id objc_constructInstance ( Class cls, void *bytes ); // 銷燬類實例 void * objc_destructInstance ( id obj );
// 獲取已註冊的類定義的列表 int objc_getClassList ( Class *buffer, int bufferCount ); // 建立並返回一個指向全部已註冊類的指針列表 Class * objc_copyClassList ( unsigned int *outCount ); // 返回指定類的類定義 Class objc_lookUpClass ( const char *name ); Class objc_getClass ( const char *name ); Class objc_getRequiredClass ( const char *name ); // 返回指定類的元類 Class objc_getMetaClass ( const char *name );