iOS Runtime (一)

講到runtime 必須要知道這兩個(gè)頭文件

#import <objc/runtime.h>  
#import <objc/message.h>

一及皂、動(dòng)態(tài)創(chuàng)建類(lèi)

OBJC_EXPORT void objc_registerClassPair(Class cls) 
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0);

動(dòng)態(tài)創(chuàng)建類(lèi)分為兩個(gè)過(guò)程:
1、添加成員變量(class_addIvar)且改。
2验烧、添加成員方法(sel_registerName,class_addMethod)又跛。

//開(kāi)始類(lèi)的定義
Class Test= objc_allocateClassPair([NSObject class], "Test", 0);
//為類(lèi)添加變量
class_addIvar(Test, "_name", sizeof(NSString*), log2(sizeof(NSString*)), @encode(NSString*));
//為類(lèi)添加方法
//1.注冊(cè)名為 test: 的方法
SEL s = sel_registerName("test:");
//2.定義函數(shù)實(shí)現(xiàn),此處的IMP是函數(shù)指針,原型為 typedef id (*IMP)(id, SEL, ...);
IMP i = imp_implementationWithBlock(^(id this,id some){
    NSLog(@"%@",some);
    return @111;
});
//關(guān)聯(lián)Test,s,i碍拆,并確認(rèn)函數(shù)簽名
class_addMethod(Test, s, i, "i@:");
//結(jié)束類(lèi)的定義
objc_registerClassPair(Test);

調(diào)用對(duì)象

//創(chuàng)建對(duì)象
id t = [[Test alloc]init];
//KVC 動(dòng)態(tài)改變 對(duì)象t 中的實(shí)例變量
[t setValue:@"張三" forKey:@"name"];
NSLog(@"%@",[t valueForKey:@"name"]);
//調(diào)用 t 對(duì)象中的 s 方法選擇器對(duì)于的方法
id result = objc_msgSend(t, s,@"傳送內(nèi)容");
NSLog(@"%@",result);

運(yùn)行結(jié)果

2014-08-15 00:11:00.239 Test[44644:303] 張三
2014-08-15 00:11:00.240 Test[44644:303] 傳送內(nèi)容
2014-08-15 00:11:00.241 Test[44644:303] 111

二、Runtime 速查

objc_
class_
object_
method_
property_
protocol_
ivar_ ,sel_ ,imp_

1.objc_xxx 系列函數(shù)
函數(shù)名稱(chēng) 函數(shù)作用

objc_getClass   獲取Class對(duì)象
objc_getMetaClass   獲取MetaClass對(duì)象
objc_allocateClassPair  分配空間,創(chuàng)建類(lèi)(僅在 創(chuàng)建之后,注冊(cè)之前 能夠添加成員變量)
objc_registerClassPair  注冊(cè)一個(gè)類(lèi)(注冊(cè)后方可使用該類(lèi)創(chuàng)建對(duì)象)
objc_disposeClassPair   注銷(xiāo)某個(gè)類(lèi)
objc_allocateProtocol   開(kāi)辟空間創(chuàng)建協(xié)議
objc_registerProtocol   注冊(cè)一個(gè)協(xié)議
objc_constructInstance  構(gòu)造一個(gè)實(shí)例對(duì)象(ARC下無(wú)效)
objc_destructInstance   析構(gòu)一個(gè)實(shí)例對(duì)象(ARC下無(wú)效)
objc_setAssociatedObject    為實(shí)例對(duì)象關(guān)聯(lián)對(duì)象
objc_getAssociatedObje*ct   獲取實(shí)例對(duì)象的關(guān)聯(lián)對(duì)象
objc_removeAssociatedObjects    清空實(shí)例對(duì)象的所有關(guān)聯(lián)對(duì)象
objc_msgSend    發(fā)送ObjC消息

objc_系列函數(shù)關(guān)注于宏觀使用,如類(lèi)與協(xié)議的空間分配,注冊(cè),注銷(xiāo)等操作

2.class_xxx 系列函數(shù)
函數(shù)名稱(chēng) 函數(shù)作用

class_addIvar   為類(lèi)添加實(shí)例變量
class_addProperty   為類(lèi)添加屬性
class_addMethod 為類(lèi)添加方法
class_addProtocol   為類(lèi)遵循協(xié)議
class_replaceMethod 替換類(lèi)某方法的實(shí)現(xiàn)
class_getName   獲取類(lèi)名
class_isMetaClass   判斷是否為元類(lèi)
objc_getProtocol    獲取某個(gè)協(xié)議
objc_copyProtocolList   拷貝在運(yùn)行時(shí)中注冊(cè)過(guò)的協(xié)議列表
class_getSuperclass 獲取某類(lèi)的父類(lèi)
class_setSuperclass 設(shè)置某類(lèi)的父類(lèi)
class_getProperty   獲取某類(lèi)的屬性
class_getInstanceVariable   獲取實(shí)例變量
class_getClassVariable  獲取類(lèi)變量
class_getInstanceMethod 獲取實(shí)例方法
class_getClassMethod    獲取類(lèi)方法
class_getMethodImplementation   獲取方法的實(shí)現(xiàn)
class_getInstanceSize   獲取類(lèi)的實(shí)例的大小
class_respondsToSelector    判斷類(lèi)是否實(shí)現(xiàn)某方法
class_conformsToProtocol    判斷類(lèi)是否遵循某協(xié)議
class_createInstance    創(chuàng)建類(lèi)的實(shí)例
class_copyIvarList  拷貝類(lèi)的實(shí)例變量列表
class_copyMethodList    拷貝類(lèi)的方法列表
class_copyProtocolList  拷貝類(lèi)遵循的協(xié)議列表
class_copyPropertyList  拷貝類(lèi)的屬性列表

class_系列函數(shù)關(guān)注于類(lèi)的內(nèi)部,如實(shí)例變量,屬性,方法,協(xié)議等相關(guān)問(wèn)題

3.object_xxx 系列函數(shù)
函數(shù)名稱(chēng) 函數(shù)作用

object_copy 對(duì)象copy(ARC無(wú)效)
object_dispose  對(duì)象釋放(ARC無(wú)效)
object_getClassName 獲取對(duì)象的類(lèi)名
object_getClass 獲取對(duì)象的Class
object_setClass 設(shè)置對(duì)象的Class
object_getIvar  獲取對(duì)象中實(shí)例變量的值
object_setIvar  設(shè)置對(duì)象中實(shí)例變量的值
object_getInstanceVariable  獲取對(duì)象中實(shí)例變量的值 (ARC中無(wú)效,使用object_getIvar)
object_setInstanceVariable  設(shè)置對(duì)象中實(shí)例變量的值 (ARC中無(wú)效,使用object_setIvar)

objcet_系列函數(shù)關(guān)注于對(duì)象的角度,如實(shí)例變量

4.method_xxx 系列函數(shù)
函數(shù)名稱(chēng) 函數(shù)作用

method_getName  獲取方法名
method_getImplementation    獲取方法的實(shí)現(xiàn)
method_getTypeEncoding  獲取方法的類(lèi)型編碼
method_getNumberOfArguments 獲取方法的參數(shù)個(gè)數(shù)
method_copyReturnType   拷貝方法的返回類(lèi)型
method_getReturnType    獲取方法的返回類(lèi)型
method_copyArgumentType 拷貝方法的參數(shù)類(lèi)型
method_getArgumentType  獲取方法的參數(shù)類(lèi)型
method_getDescription   獲取方法的描述
method_setImplementation    設(shè)置方法的實(shí)現(xiàn)
method_exchangeImplementations  替換方法的實(shí)現(xiàn)

method_系列函數(shù)關(guān)注于方法內(nèi)部,如果方法的參數(shù)及返回值類(lèi)型和方法的實(shí)現(xiàn)

5.property_xxx 系列函數(shù)
函數(shù)名稱(chēng) 函數(shù)作用

property_getName    獲取屬性名
property_getAttributes  獲取屬性的特性列表
property_copyAttributeList  拷貝屬性的特性列表
property_copyAttributeValue 拷貝屬性中某特性的值

property_系類(lèi)函數(shù)關(guān)注與屬性*內(nèi)部,如屬性的特性等

6.protocol_xxx 系列函數(shù)
函數(shù)名稱(chēng) 函數(shù)作用

protocol_conformsToProtocol 判斷一個(gè)協(xié)議是否遵循另一個(gè)協(xié)議
protocol_isEqual    判斷兩個(gè)協(xié)議是否一致
protocol_getName    獲取協(xié)議名稱(chēng)
protocol_copyPropertyList   拷貝協(xié)議的屬性列表
protocol_copyProtocolList   拷貝某協(xié)議所遵循的協(xié)議列表
protocol_copyMethodDescriptionList  拷貝協(xié)議的方法列表
protocol_addProtocol    為一個(gè)協(xié)議遵循另一協(xié)議
protocol_addProperty    為協(xié)議添加屬性
protocol_getProperty    獲取協(xié)議中的某個(gè)屬性
protocol_addMethodDescription   為協(xié)議添加方法描述
protocol_getMethodDescription   獲取協(xié)議中某方法的描述

7.ivar_xxx 系列函數(shù)
函數(shù)名稱(chēng) 函數(shù)作用

ivar_getName    獲取Ivar名稱(chēng)
ivar_getTypeEncoding    獲取類(lèi)型編碼
ivar_getOffset  獲取偏移量

8.sel_xxx 系列函數(shù)
函數(shù)名稱(chēng) 函數(shù)作用

sel_getName 獲取名稱(chēng)
sel_getUid  注冊(cè)方法
sel_registerName    注冊(cè)方法
sel_isEqual 判斷方法是否相等

9.imp_xxx 系列函數(shù)
函數(shù)名稱(chēng) 函數(shù)作用

imp_implementationWithBlock 通過(guò)代碼塊創(chuàng)建IMP
imp_getBlock    獲取函數(shù)指針中的代碼塊
imp_removeBlock 移除IMP中的代碼塊
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末慨蓝,一起剝皮案震驚了整個(gè)濱河市感混,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌礼烈,老刑警劉巖弧满,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異此熬,居然都是意外死亡谱秽,警方通過(guò)查閱死者的電腦和手機(jī)洽蛀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)疟赊,“玉大人,你說(shuō)我怎么就攤上這事峡碉〗矗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵鲫寄,是天一觀的道長(zhǎng)吉执。 經(jīng)常有香客問(wèn)我,道長(zhǎng)地来,這世上最難降的妖魔是什么戳玫? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮未斑,結(jié)果婚禮上咕宿,老公的妹妹穿的比我還像新娘。我一直安慰自己蜡秽,他們只是感情好府阀,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著芽突,像睡著了一般试浙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寞蚌,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天田巴,我揣著相機(jī)與錄音,去河邊找鬼挟秤。 笑死壹哺,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的煞聪。 我是一名探鬼主播斗躏,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼昔脯!你這毒婦竟也來(lái)了啄糙?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤云稚,失蹤者是張志新(化名)和其女友劉穎隧饼,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體静陈,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡燕雁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年诞丽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拐格。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡僧免,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出捏浊,到底是詐尸還是另有隱情懂衩,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布金踪,位于F島的核電站浊洞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏胡岔。R本人自食惡果不足惜法希,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望靶瘸。 院中可真熱鬧苫亦,春花似錦、人聲如沸奕锌。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)惊暴。三九已至饼丘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辽话,已是汗流浹背肄鸽。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留油啤,地道東北人典徘。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像益咬,于是被迫代替她去往敵國(guó)和親逮诲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉幽告,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 1,686評(píng)論 0 9
  • 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的...
    西木閱讀 30,548評(píng)論 33 466
  • 本文轉(zhuǎn)載自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex閱讀 749評(píng)論 0 1
  • 我們常常會(huì)聽(tīng)說(shuō) Objective-C 是一門(mén)動(dòng)態(tài)語(yǔ)言梅鹦,那么這個(gè)「動(dòng)態(tài)」表現(xiàn)在哪呢?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,182評(píng)論 0 7
  • 轉(zhuǎn)載:http://yulingtianxia.com/blog/2014/11/05/objective-c-r...
    F麥子閱讀 729評(píng)論 0 2