什么咆蒿?你還不知道iOS的反射機(jī)制

之前有沒有在大家的相互討論中,聽過“反射”這個(gè)詞币绩,而自己卻似懂非懂蜡秽?反射聽起來比較神秘,其實(shí)各位也許在自己以前的實(shí)踐中就已經(jīng)使用過了缆镣。今天就抽時(shí)間正好結(jié)合自己最近的實(shí)踐經(jīng)歷把反射整理一下芽突,希望能和大家共同交流進(jìn)步。

反射的理解

反射可以理解為類名董瞻、方法名寞蚌、屬性名等和字符串在運(yùn)行時(shí)相互轉(zhuǎn)化的一種機(jī)制田巴。

反射的原理

以執(zhí)行某個(gè)方法舉例,實(shí)質(zhì)上是發(fā)送了一個(gè)消息給Runtime挟秤,然后Runtime再根據(jù)這個(gè)Class的字符串名和這個(gè)方法的字符串名壹哺,去匹配真正相應(yīng)的方法地址,然后再執(zhí)行艘刚。同樣反射就是利用字符串去動(dòng)態(tài)的檢測(cè)管宵,從而實(shí)現(xiàn)運(yùn)行時(shí)的轉(zhuǎn)化。

常用的反射方法

常用的反射轉(zhuǎn)化方法在Foundation框架中攀甚,如下圖:


字符串與類名箩朴、方法名等相互轉(zhuǎn)化方法.png

由于OC語言的動(dòng)態(tài)性,通過在運(yùn)行時(shí)調(diào)用上面API就可以實(shí)現(xiàn)相應(yīng)的反射轉(zhuǎn)化秋度。轉(zhuǎn)化之后炸庞,就需要進(jìn)一步的操作了。通過查看NSObject這個(gè)類的源碼(如下圖)荚斯,可以看出其為我們提供了一些基礎(chǔ)的方法埠居。


轉(zhuǎn)化之后的判斷方法.png

反射示例

自己寫了個(gè)小測(cè)試demo,可以簡單看一下使用反射的示例:

Robot.h

@interface Robot : NSObject

- (void)sayHi;

@end

Robot.m

#import "Robot.h"

@implementation Robot

- (void)sayHi {
    NSLog(@"+++sayHi");
}

- (void)dance {
    NSLog(@"+++dance");
}

@end

AppDelegate.m

    Class robotCls = NSClassFromString(@"Robot");
    if (robotCls) {
        id robot1 = [[robotCls alloc] init];
        SEL sel1 = NSSelectorFromString(@"sayHi");
        SEL sel2 = NSSelectorFromString(@"dance");
        if ([robot1 respondsToSelector:sel1]) {
            [robot1 performSelector:sel1];
        }
        if ([robot1 respondsToSelector:sel2]) {
            [robot1 performSelector:sel2];
        }
    }
    
    Class carCls = NSClassFromString(@"Car");
    NSLog(@"+++carCls:%@",carCls);
    id car1 = [[carCls alloc] init];
    NSLog(@"+++car1:%@",car1);

運(yùn)行結(jié)果如下:


demo_log.png

反射的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  • 解耦合事期,消除類與類之間的依賴

缺點(diǎn)

  • 代碼可讀性降低滥壕,將原有邏輯復(fù)雜化了,不利于維護(hù)
  • 性能較差刑赶。(使用反射匹配字符串間接命中內(nèi)存比直接命中內(nèi)存的方式要慢捏浊。當(dāng)然懂衩,這個(gè)程度取決于使用場(chǎng)景撞叨,如果只是作為程序中很少涉及的部分,這個(gè)性能上的影響可以忽略不計(jì)浊洞。但是牵敷,如果在性能很關(guān)鍵的應(yīng)用核心邏輯中使用反射,性能問題就尤其重要了)

反射的應(yīng)用

通過運(yùn)用反射機(jī)制可以在運(yùn)行時(shí)動(dòng)態(tài)的創(chuàng)建類對(duì)象法希、調(diào)用方法或給屬性賦值枷餐、判斷類型等。在實(shí)際開發(fā)過程中如果合理運(yùn)用苫亦,能有效提高代碼的質(zhì)量毛肋,尤其是在架構(gòu)層面。

比如在最近的項(xiàng)目中屋剑,作為基礎(chǔ)的架構(gòu)SDK润匙,原本各功能模塊間相互依賴耦合,通過運(yùn)用一系列的反射機(jī)制唉匾,實(shí)現(xiàn)了各個(gè)模塊的解耦合孕讳,供上層接入方可以自主選擇性接入各個(gè)功能模塊匠楚,大大提升了接入的方便性與架構(gòu)模塊的可支配性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末厂财,一起剝皮案震驚了整個(gè)濱河市芋簿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌璃饱,老刑警劉巖与斤,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異荚恶,居然都是意外死亡幽告,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門裆甩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冗锁,“玉大人,你說我怎么就攤上這事嗤栓《澈樱” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵茉帅,是天一觀的道長叨叙。 經(jīng)常有香客問我,道長堪澎,這世上最難降的妖魔是什么擂错? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮樱蛤,結(jié)果婚禮上钮呀,老公的妹妹穿的比我還像新娘。我一直安慰自己昨凡,他們只是感情好爽醋,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著便脊,像睡著了一般蚂四。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哪痰,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天遂赠,我揣著相機(jī)與錄音,去河邊找鬼晌杰。 笑死跷睦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的乎莉。 我是一名探鬼主播送讲,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼奸笤,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了哼鬓?” 一聲冷哼從身側(cè)響起监右,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎异希,沒想到半個(gè)月后健盒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡称簿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年扣癣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片憨降。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡父虑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出授药,到底是詐尸還是另有隱情士嚎,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布悔叽,位于F島的核電站莱衩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏娇澎。R本人自食惡果不足惜笨蚁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望趟庄。 院中可真熱鬧括细,春花似錦、人聲如沸岔激。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虑鼎。三九已至,卻和暖如春键痛,著一層夾襖步出監(jiān)牢的瞬間炫彩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國打工絮短, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留江兢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓丁频,卻偏偏與公主長得像杉允,于是被迫代替她去往敵國和親邑贴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349