Objective-C是C語言的擴展,讓C具備了面向對象的能力影晓,而且它是一門動態(tài)語言迷守。這都要歸功于runtime犬绒。或者可以說兑凿,Objective-C = C + Runtime;
Runtime的開源是熱更的產(chǎn)生基礎條件凯力,然而蘋果因為“安全因素”又禁止了熱更,JSPatch目前正在努力解決安全問題急膀,從腳本內容RSA加密沮协,到搜索敏感私有接口調用。理論上來講卓嫂,ios應用可以完全依托于JSPatch做開發(fā),就避免了發(fā)版和升級的煩惱聘殖。
內存模型:
Class:
typedef struct objc_class *Class;
struct objc_class {
Class isa; ?//指向meta_class
Class super_class; ? ? //指向父類
const char* name;
long version;
long info;
long instance_size;
struct objc_ivar_list *ivars; //類的成員變量晨雳,使用數(shù)組存儲,使用中基本不變化(只有動態(tài)生成的類才能添加成員變量Ivar)奸腺,存取效率高餐禁。
struct objc_method_list **methodLists; ?//類的成員方法,使用鏈表存儲突照。使用中可能會增加方法帮非,使用鏈表存儲。
struct objc_cache *cache; ? //類的方法緩存。
struct objc_protocol_list *protocols; ?//類遵守的協(xié)議末盔。 ??
};
需要區(qū)分的是筑舅,Class和meta-Class的cache內容不同,Class的cache里面都是實例方法陨舱,meta-Class的cache里面都是類方法翠拣。
Meta-Class
獲取meta-class的方法。
objc_getClass((__bridge void*)[NSObject class])
Class objc_getMetaClass(const char* name) //name: The name of the class to look up
對象
struct objc_object {
Class isa; //指向對象所屬的類游盲。
};
typedef struct objc_object ?*id;
當創(chuàng)建一個特定類的實例對象時误墓,分配的內存包含一個objc_object數(shù)據(jù)結構,然后是類的實例變量的數(shù)據(jù)益缎。
NSObject類的alloc和allocWithZone:方法使用函數(shù)class_createInstance來創(chuàng)建objc_object數(shù)據(jù)結構谜慌。
我們常見的id,它是一個objc_object結構類型的指針莺奔。它的存在可以讓我們實現(xiàn)類似于C++中泛型的一些操作畦娄。該類型的對象可以轉換為任何一種對象,有點類似于C語言中void *指針類型的作用弊仪。C語言中void * 為 “不確定類型指針”熙卡,void *可以用來聲明指針。如:void * a励饵;?
Method
structobjc_method {
SEL method_name; //選擇器
char* method_types;//參數(shù)types是一個描述傳遞給方法的參數(shù)類型的字符數(shù)組驳癌,這涉及到類型編碼。
IMP method_imp; //函數(shù)指針役听。
}
SEL
typedef struct objc_selector *SEL
選擇器颓鲜,用于定位一個方法,可以理解為一個字符串典予。
runtime.h并沒有提供SEL結構體的具體實現(xiàn)甜滨。而只是定義了SEL,typedef struct objc_selector *SEL; 可以這樣理解瘤袖,方法名和SEL之間存在一種映射關系衣摩,理論上SEL是對方法名做一個hash處理。只是猜測捂敌。無論方法名與SEL之間的映射是怎樣的艾扮,它們兩個都是用來區(qū)分一個方法。但是需要注意占婉,runtime官方用來標識一個Method的是Method的SEL泡嘴,而不是方法名。
IMP
typedef id (*IMP) (id,SEL, ...);
可以看出IMP就是一個函數(shù)指針逆济,它的前兩個參數(shù)id代表消息接受者self酌予,SEL代表方法選擇器cmd磺箕。
成員變量
typedef struct objc_ivar * Ivar;
struct objc_ivar {
char* ivar_name;
char* ivar_type;
int ivar_offset;
int space;
}
Property
typedef struct objc_property *objc_property_t;
Category
typedef struct objc_category *Category;
structobjc_category {
char* category_name;
char* class_name;
struct objc_method_list *instance_methods ;
struct objc_method_list *class_methods;
struct objc_protocol_list *protocols;
}
Protocol
typedef struct objc_object Protocol;
一個經(jīng)典的指向圖
注意兩個特殊連線:
1,所有元類的isa指針指向的是根類的元類抛虫。
2松靡,根類的元類的父類指向的是根類本身。