iOS_經(jīng)驗(1)_Runtime_Api查詢

0丶介紹

Objc是一門動態(tài)語言草戈,所以它總是想辦法把一些決定工作從編譯連接推遲到運行時塌鸯。需要一個運行時系統(tǒng) (runtime system) 來執(zhí)行編譯后的代碼。
Runtime基本是用C和匯編寫的唐片,可見蘋果為了動態(tài)系統(tǒng)的高效而作出的努力丙猬。

官網(wǎng)文檔還提供關(guān)于傳統(tǒng)和現(xiàn)代版本Runtime的說明
In the legacy runtime, if you change the layout of instance variables in a class, you must recompile classes that inherit from it.
In the modern runtime, if you change the layout of instance variables in a class, you do not have to recompile classes that inherit from it.In addition, the modern runtime supports instance variable synthesis for declared properties (see Declared Properties in The Objective-C Programming Language).

一丶Objective-C運行時定義了幾種重要的類型。

-Class:定義Objective-C類
-Ivar:定義對象的實例變量费韭,包括類型和名字茧球。
-Protocol:定義正式協(xié)議。
-objc_property_t:定義屬性星持。叫這個名字可能是為了防止和Objective-C1.0中的用戶類型沖突抢埋,那時候還沒有屬性。
-Method:定義對象方法或類方法督暂。這個類型提供了方法的名字(就是**選擇器**)揪垄、參數(shù)數(shù)量和類型,以及返回值(這些信息合起來稱為方法的**簽名**)逻翁,還有一個指向代碼的函數(shù)指針(也就是方法的**實現(xiàn)**)饥努。
-SEL:定義選擇器。選擇器是方法名的唯一標(biāo)識符八回。
-IMP:定義方法實現(xiàn)酷愧。這只是一個指向某個函數(shù)的指針,該函數(shù)接受一個對象辽社、一個選擇器和一個可變長參數(shù)列表(varargs)伟墙,返回一個對象。
-Class:定義Objective-C類
-Ivar:定義對象的實例變量滴铅,包括類型和名字。
-Protocol:定義正式協(xié)議就乓。
-objc_property_t:定義屬性汉匙。叫這個名字可能是為了防止和Objective-C1.0中的用戶類型沖突拱烁,那時候還沒有屬性。
-Method:定義對象方法或類方法噩翠。這個類型提供了方法的名字(就是**選擇器**)戏自、參數(shù)數(shù)量和類型,以及返回值(這些信息合起來稱為方法的**簽名**)伤锚,還有一個指向代碼的函數(shù)指針(也就是方法的**實現(xiàn)**)擅笔。
-SEL:定義選擇器。選擇器是方法名的唯一標(biāo)識符屯援。
-IMP:定義方法實現(xiàn)猛们。這只是一個指向某個函數(shù)的指針,該函數(shù)接受一個對象狞洋、一個選擇器和一個可變長參數(shù)列表(varargs)弯淘,返回一個對象。

二丶API的速查手冊使用

1.objc_xxx 系列函數(shù)

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

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

2.class_xxx 系列函數(shù)**

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

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

3.object_xxx 系列函數(shù)**

函數(shù)名稱函數(shù)作用
object_copy對象copy(ARC無效)
object_dispose對象釋放(ARC無效)
object_getClassName獲取對象的類名
object_getClass獲取對象的Class
object_setClass設(shè)置對象的Class
object_getIvar獲取對象中實例變量的值
object_setIvar設(shè)置對象中實例變量的值
object_getInstanceVariable獲取對象中實例變量的值 (ARC中無效,使用object_getIvar)
object_setInstanceVariable設(shè)置對象中實例變量的值 (ARC中無效,使用object_setIvar)

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

4.method_xxx 系列函數(shù)

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

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

5.property_xxx 系列函數(shù)**

函數(shù)名稱函數(shù)作用
property_getName獲取屬性名
property_getAttributes獲取屬性的特性列表
property_copyAttributeList拷貝屬性的特性列表
property_copyAttributeValue拷貝屬性中某特性的值
-
**property_系類函數(shù)關(guān)注與屬性*內(nèi)部,如屬性的特性等**

6.protocol_xxx 系列函數(shù)

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

7.ivar_xxx 系列函數(shù)

函數(shù)名稱函數(shù)作用
ivar_getName獲取Ivar名稱
ivar_getTypeEncoding獲取類型編碼
ivar_getOffset獲取偏移量

8.sel_xxx 系列函數(shù)

函數(shù)名稱函數(shù)作用
sel_getName獲取名稱
sel_getUid注冊方法
sel_registerName注冊方法
sel_isEqual判斷方法是否相等

9.imp_xxx 系列函數(shù)

函數(shù)名稱函數(shù)作用
imp_implementationWithBlock通過代碼塊創(chuàng)建IMP
imp_getBlock獲取函數(shù)指針中的代碼塊
imp_removeBlock移除IMP中的代碼塊

三丶簡單使用

1. 動態(tài)的添加對象的成員變量和方法
2. 動態(tài)交換兩個方法的實現(xiàn)
3. 實現(xiàn)分類也可以添加屬性
4. 實現(xiàn)NSCoding的自動歸檔和解檔
5. 實現(xiàn)字典轉(zhuǎn)模型的自動轉(zhuǎn)換

//1.檢查是否有某個屬性或變量

- (BOOL)hasAttribute:(NSString *)attName
{
    BOOL flag = NO;
    u_int count;
    Ivar *ivars = class_copyIvarList([self class], &count);
    for (int i = 0; i < count; i++)
    {
        const char *propertyName = ivar_getName(ivars[i]);
        NSString *strName = [NSString stringWithCString:propertyName encoding:NSUTF8StringEncoding];
        if ([attName isEqualToString:strName])
        {
            flag = YES;
        }
        NSLog(@"===>%@", strName);
    }
    return flag;
}

//2.獲取屬性列表

unsigned int count;
objc_property_t *propertyList = class_copyPropertyList([self class], &count);
for (unsigned int i = 0; i< count; i++)
{
    const char *name = property_getName(propertyList[i]);
    NSLog(@"__%@",[NSString stringWithUTF8String:name]);
    
    //得到屬性的各種信息
    { //得到屬性的各種信息
        objc_property_t property = propertyList[i];
        const char *a = property_getAttributes(property);
        NSLog(@"屬性信息__%@",[NSString stringWithUTF8String:a]);
    }
}

//3.交換2個方法

第一種:
Method oldMethod1 = class_getInstanceMethod([self class], @selector(viewDidLoad));
Method newMethod1 = class_getInstanceMethod([self class], @selector(xzbViewDidLoad));
method_exchangeImplementations(oldMethod1, newMethod1);
第二種:
Method oldMethod1 = class_getInstanceMethod([self class], @selector(viewDidLoad));
Method newMethod1 = class_getInstanceMethod([self class], @selector(xzbViewDidLoad));
method_setImplementation(oldMethod1, method_getImplementation(newMethod1));

//4.創(chuàng)建一個新類:objc_allocateClassPair


//創(chuàng)建一個新類:objc_allocateClassPair
Class newClass = objc_allocateClassPair([UIView class], "XZBCustomView", 0);
//給類增加新的方法:class_addMethod
class_addMethod(newClass, @selector(report), (IMP)ReportFunction, "v@:");
//注冊新類:objc_registerClassPair
objc_registerClassPair(newClass);

//實例;
id instanceOfNewClass = [[newClass alloc] init];
//調(diào)用report
[instanceOfNewClass performSelector:@selector(report)];

void ReportFunction(id self, SEL _cmd)
{
    NSLog(@"This object is %p",self);//This object is 0x7fb2d2e0f900
    NSLog(@"Class is %@,and super is %@",[self class],[self superclass]);// Class is XZBCustomView,and super is UIView
    Class currenClass = [self class];
    for (int i = 0; i<5; i++)
    {
        NSLog(@"%d  %p",i,currenClass);
        //獲取isa指針指向的對象object_getClass
        currenClass = object_getClass(currenClass);
        NSLog(@"NSObject:%p",[NSObject class]);
        NSLog(@"object_getClass:%p",object_getClass([NSObject class]));
        
    }
}

四丶擴(kuò)展

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吉懊,一起剝皮案震驚了整個濱河市庐橙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌借嗽,老刑警劉巖态鳖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異恶导,居然都是意外死亡郁惜,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門甲锡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兆蕉,“玉大人,你說我怎么就攤上這事缤沦』⒃希” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵缸废,是天一觀的道長包蓝。 經(jīng)常有香客問我,道長企量,這世上最難降的妖魔是什么测萎? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮届巩,結(jié)果婚禮上硅瞧,老公的妹妹穿的比我還像新娘。我一直安慰自己恕汇,他們只是感情好腕唧,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布或辖。 她就那樣靜靜地躺著,像睡著了一般枣接。 火紅的嫁衣襯著肌膚如雪颂暇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天但惶,我揣著相機與錄音耳鸯,去河邊找鬼。 笑死膀曾,一個胖子當(dāng)著我的面吹牛县爬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播妓肢,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼捌省,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了碉钠?” 一聲冷哼從身側(cè)響起纲缓,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎喊废,沒想到半個月后祝高,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡污筷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年工闺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓣蛀。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡陆蟆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惋增,到底是詐尸還是另有隱情叠殷,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布诈皿,位于F島的核電站林束,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏稽亏。R本人自食惡果不足惜壶冒,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望截歉。 院中可真熱鬧胖腾,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凉逛。三九已至性宏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間状飞,已是汗流浹背毫胜。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诬辈,地道東北人酵使。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像焙糟,于是被迫代替她去往敵國和親口渔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

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

  • 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的轉(zhuǎn)載 這篇文章完全是基于南峰子老師博客的...
    西木閱讀 30,568評論 33 466
  • 我們常常會聽說 Objective-C 是一門動態(tài)語言穿撮,那么這個「動態(tài)」表現(xiàn)在哪呢缺脉?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,199評論 0 7
  • 目錄 Objective-C Runtime到底是什么 Objective-C的元素認(rèn)知 Runtime詳解 應(yīng)用...
    Ryan___閱讀 1,939評論 1 3
  • 本文轉(zhuǎn)載自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex閱讀 767評論 0 1
  • 撫琴在花叢 花如爾顏容 蝴蝶點點飛 疏影沐春風(fēng)
    真沾老劉閱讀 139評論 2 1