Objective-C objc_class 介绍
Objective-C objc_class 介紹
NSObject
Objective-C 中 NSObject是大多數類的根類。
@interface NSObject <NSObject> {Class isa OBJC_ISA_AVAILABILITY; }它有一個isa屬性,類型是Class.
蘋果已經將 ObjC runtime 代碼開源了,我們下載下,看看Class究竟是什么http://opensource.apple.com/tarballs/objc4/objc4-493.9.tar.gz
objc_class
我們能夠在<objc.h>文件中看到Class的定義
typedef struct objc_class *Class; typedef struct objc_object {Class isa; } *id;Class 是一個 objc_class 結構類型的指針, id是一個 objc_object 結構類型的指針.
objc_class的定義能夠在<runtime.h>里找到
struct objc_class {Class isa;Class super_class;const char *name;long version;long info;long instance_size;struct objc_ivar_list *ivars;struct objc_method_list **methodLists;struct objc_cache *cache;struct objc_protocol_list *protocols;} OBJC2_UNAVAILABLE;接下來我們來看下每一個屬性的意思
isa
是一個 Objective-C Class 類型的指針. 實例對象有個isa的屬性,指向Class, 而Class里也有個isa的屬性, 指向meteClass. 這里就有個點, 在Objective-C中不論什么的類定義都是對象.
super_class
指向該類的父類, 假設該類已經是最頂層的根類(如 NSObject 或 NSProxy),那么 super_class 就為 NULL.
他們的關系呢,這里有個圖http://www.sealiesoftware.com/blog/class%20diagram.pdf
name
我們先看下以下的代碼
id objc_getClass(const char *aClassName) {if (!aClassName) return Nil;// NO unconnected, YES class handlerreturn look_up_class(aClassName, NO, YES); }PRIVATE_EXTERN id look_up_class(const char *aClassName, BOOL includeUnconnected, BOOL includeClassHandler) {BOOL includeClassLoader = YES; // class loader cannot be skippedid result = nil;struct old_class query;query.name = aClassName;retry:if (!result && class_hash) {// Check ordinary classesmutex_lock (&classLock);result = (id)NXHashGet(class_hash, &query);mutex_unlock (&classLock);}if (!result && includeUnconnected && unconnected_class_hash) {// Check not-yet-connected classesmutex_lock(&classLock);result = (id)NXHashGet(unconnected_class_hash, &query);mutex_unlock(&classLock);}if (!result && includeClassLoader && _objc_classLoader) {// Try class loader callbackif ((*_objc_classLoader)(aClassName)) {// Re-try lookup without class loaderincludeClassLoader = NO;goto retry;}}if (!result && includeClassHandler && objc_classHandler) {// Try class handler callbackif ((*objc_classHandler)(aClassName)) {// Re-try lookup without class handler or class loaderincludeClassLoader = NO;includeClassHandler = NO;goto retry;}}return result; }struct old_class {struct old_class *isa;struct old_class *super_class;const char *name;long version;long info;long instance_size;struct old_ivar_list *ivars;struct old_method_list **methodLists;Cache cache;struct old_protocol_list *protocols;// CLS_EXT onlyconst uint8_t *ivar_layout;struct old_class_ext *ext; };objc_getClass從一個字串返回一個類,look_up_class,先創建一個old_class對象,name賦值為這個字串,假設找到了,就返回old_class.看下old_class的結構就能看出name這個屬性存的值就是類的名字(事實上name不就是名字嘛)
version
類的版本號信息,默覺得0
info
供執行期使用的一些位標識。
instance_size
該類的實例變量大小
ivars
struct objc_ivar_list {int ivar_count;/* variable length structure */struct objc_ivar ivar_list[1]; }成員變量的數組
methodLists
方法定義的數組
struct objc_method_list {struct objc_method_list *obsolete;int method_count;/* variable length structure */struct objc_method method_list[1]; }objc_cache
指向近期使用的方法.用于方法調用的優化.
struct objc_cache {unsigned int mask /* total = mask + 1 */;unsigned int occupied;Method buckets[1]; };protocols
協議的數組
struct objc_protocol_list {struct objc_protocol_list *next;long count;Protocol *list[1]; };轉載于:https://www.cnblogs.com/claireyuancy/p/6719655.html
總結
以上是生活随笔為你收集整理的Objective-C objc_class 介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ORACLE普通表转换成分区表
- 下一篇: python学习笔记-flask学习(一