認識下反射機制

聽名字可能有點不認識魄咕,但是介紹下其作用,就會覺得恍然大悟员凝,原來它就叫反射。

0x01 什么是反射

這種動態(tài)編程機制驾霜,可以讓Objective-C語言更加靈活,說到反射买置,首先我們需要弄清楚什么是反射:

在運行中程序檢查自己和軟件運行環(huán)境的能力粪糙,它可以根據(jù)它發(fā)現(xiàn)的進行改變。

通俗的講就是 反射可以在運行時根據(jù)類名獲得類的信息忿项。


0x01 為什么要用反射

當你要做一個軟件可以安裝插件的功能蓉冈,你連插件的類型名稱都不知道,怎么示例化這個對象呢轩触?

因為程序是支持插件的(第三方)寞酿,在開發(fā)的時候并不清楚。

所以脱柱,無法在代碼中new出來伐弹,但反射可以,通過反射榨为,動態(tài)加載程序集惨好,然后讀出類,檢查標記之后再實例化對象随闺,就可以獲得正確的類示例日川。

反射的目的就是為了擴展未知的應用

iOS中反射及其用處

由于Objective-C是動態(tài)語言矩乐,其具備在運行時操作類的方案龄句。

我們可以很方便的通過類名創(chuàng)建指定的類,并且可以通過系統(tǒng)提供的API獲取類中的方法绰精,屬性等信息撒璧。

通過反射機制,我們可以實現(xiàn)很多有意思的功能笨使,比如:

json->model方案
后臺消息確定動態(tài)跳轉頁面
將相似功能的代碼抽象組合成更加通用的框架卿樱,比如全局跳轉,消息中心

0x02 反射怎么用

  • 根據(jù)字符串/操作獲取信息

NSClassFromString           // Obtains a class by name.
NSStringFromClass           // Returns the name of a class as a string.
NSSelectorFromString    // Returns the selector with a given name.
NSStringFromSelector    // Returns a string representation of a given selector.
NSStringFromProtocol    // Returns the name of a protocol as a string.
NSProtocolFromString    // Returns a the protocol with a given name.
  • 簡單操作
// 根據(jù)字符串名獲取Class對象
Class clazz = NSClassFromString(@"Car") ;

//直接使用Class來創(chuàng)建對象
id car = [[clazz alloc] init] ;

// 使用performSelector:動態(tài)執(zhí)行方法
[car performSelector:NSSelectorFromString(startEngine)];

  • 與運行時一起用功能更加強大
// 獲取成員變量列表
Ivar  _Nonnull * class_copyIvarList(Class cls, unsigned int *outCount);
// 獲取屬性列表
objc_property_t  _Nonnull * class_copyPropertyList(Class cls, unsigned int *outCount);
// 獲取方法列表
Method  _Nonnull * class_copyMethodList(Class cls, unsigned int *outCount);

// 還有許多強大的API可以提供操作

0x03 優(yōu)缺點

優(yōu)點:

1. 增加程序靈活性硫椰,避免將程序寫死代碼中
2. 代碼簡潔繁调,提高代碼復用率,外部調用方便
3. 對于任意一個類靶草,都能夠知道這個類的所有屬性和方法蹄胰;對于任意一個對象都可以調用它任意的方法

缺點:

1. 使用反射,抽象度比較高奕翔,不利于代碼閱讀
2. 對字符串要求比較嚴格裕寨,需要完整對應上,如果代碼采用了混淆方案,則難以維護
3. 私有方法可以被訪問宾袜,破壞封裝性
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末捻艳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子庆猫,更是在濱河造成了極大的恐慌认轨,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件月培,死亡現(xiàn)場離奇詭異嘁字,居然都是意外死亡,警方通過查閱死者的電腦和手機杉畜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門纪蜒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人寻行,你說我怎么就攤上這事霍掺。” “怎么了拌蜘?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵杆烁,是天一觀的道長。 經(jīng)常有香客問我简卧,道長兔魂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任举娩,我火速辦了婚禮析校,結果婚禮上,老公的妹妹穿的比我還像新娘铜涉。我一直安慰自己智玻,他們只是感情好,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布芙代。 她就那樣靜靜地躺著吊奢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纹烹。 梳的紋絲不亂的頭發(fā)上页滚,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天,我揣著相機與錄音铺呵,去河邊找鬼裹驰。 笑死,一個胖子當著我的面吹牛片挂,可吹牛的內容都是我干的幻林。 我是一名探鬼主播贞盯,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼沪饺!你這毒婦竟也來了邻悬?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤随闽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后肝谭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掘宪,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年攘烛,在試婚紗的時候發(fā)現(xiàn)自己被綠了魏滚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡坟漱,死狀恐怖鼠次,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情芋齿,我是刑警寧澤腥寇,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站觅捆,受9級特大地震影響赦役,放射性物質發(fā)生泄漏。R本人自食惡果不足惜栅炒,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一掂摔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赢赊,春花似錦乙漓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至秀鞭,卻和暖如春趋观,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锋边。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工皱坛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人豆巨。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓剩辟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子贩猎,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354