iOS-Method Swizzling的實(shí)際應(yīng)用場景

Method Swzzling缴挖,是指runtime的一個API方法

在程序執(zhí)行的時候交換兩個方法的實(shí)現(xiàn)

使用runtime的這個交換方法結(jié)合分類category可以改變系統(tǒng)本身的方法,在系統(tǒng)本身方法的基礎(chǔ)上增加代碼操作。

比方說一個項(xiàng)目基本搭建完畢后,我們想在用戶每一次進(jìn)入控制器的時候都做一個標(biāo)記,統(tǒng)計(jì)這個用戶進(jìn)入了多少次這個控制器识埋。但是整個項(xiàng)目中控制器都非常多,全在viewdidload中要寫的代碼多而且工作量大零渐。用繼承的方法創(chuàng)建一個基類可以滿足需求窒舟,但是要修改的還是很多,而且之后的控制器還需要繼承這個類诵盼。

Method swizzing配合類別可以實(shí)現(xiàn)在不干擾其它工程代碼的情況下為系統(tǒng)的方法添加功能惠豺。

按照上面的那個需求,我們要為所有控制器的viewdidload添加一個記錄用戶點(diǎn)擊次數(shù)的功能风宁。

新建一個UIViewController的類別洁墙。在.m中做了這樣的事情

并不需要導(dǎo)入這個分類的頭文件。在類文件剛被加載(程序啟動前)就會調(diào)用杀糯,我們將兩個對象方法進(jìn)行了交換扫俺。系統(tǒng)的viewDidLoad和自定義的FlagDidLoad方法苍苞。即所有控制器在調(diào)用viewDidLoad的時候都會進(jìn)入到flagDidLoad當(dāng)中固翰,flagDidload里面又發(fā)現(xiàn)了flagDIdload方法,因?yàn)樽隽私粨Q羹呵,這時候控制器會執(zhí)行本身的viewDidLoad方法骂际,不會發(fā)生死循環(huán)。

到目前為止冈欢,我們約等于什么事情都沒做歉铝。程序運(yùn)行起來走的方法跟之前一模一樣。但是我們在flagDidLoad下方可以添加自己想要的功能了凑耻。比方說打印一個coming太示。這時候整個程序中只要有控制器調(diào)用viewDidLoad方法,控制臺都會打印一條coming.

接下來的事情想必大家也知道了香浩。每次進(jìn)入控制器做個標(biāo)記类缤,把NSlog換作記錄的方法即可。

運(yùn)行幾次之后控制臺的輸出邻吭。接下來根據(jù)業(yè)務(wù)需求處理數(shù)據(jù)就好了餐弱。

如果我們想給某幾個特定的控制器做記錄,隨意加判斷了。

這樣只會記錄這兩個控制器了膏蚓。

我們通過Method Swizzing給系統(tǒng)的viewdidload添加功能瓢谢,使整個項(xiàng)目中的Viewdidload方法下面都不用新增代碼了。同理其它系統(tǒng)方法也可以用類似的方法驮瞧。

比方說有些項(xiàng)目是完全自定義導(dǎo)航欄的氓扛,每一個控制器的導(dǎo)航欄都是隱藏掉的,在各個控制器的viewWillAppear中可能都寫了[self.navigationController.navigationBarsetHidden:YES];這個方法论笔。

這個時候我們也可以用交換方法汹押,統(tǒng)一給所有控制器viewWillAppear添加這個隱藏的方法。

github

參考:http://www.cocoachina.com/ios/20160121/15076.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末骇扇,一起剝皮案震驚了整個濱河市忍法,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌毅臊,老刑警劉巖理茎,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異管嬉,居然都是意外死亡皂林,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進(jìn)店門蚯撩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來础倍,“玉大人,你說我怎么就攤上這事胎挎」灯簦” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵犹菇,是天一觀的道長德迹。 經(jīng)常有香客問我,道長揭芍,這世上最難降的妖魔是什么胳搞? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮称杨,結(jié)果婚禮上肌毅,老公的妹妹穿的比我還像新娘。我一直安慰自己姑原,他們只是感情好悬而,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著页衙,像睡著了一般摊滔。 火紅的嫁衣襯著肌膚如雪阴绢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天艰躺,我揣著相機(jī)與錄音呻袭,去河邊找鬼。 笑死腺兴,一個胖子當(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
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盼玄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年贴彼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片埃儿。...
    茶點(diǎn)故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡器仗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出童番,到底是詐尸還是另有隱情精钮,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布妓盲,位于F島的核電站杂拨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏悯衬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一檀夹、第九天 我趴在偏房一處隱蔽的房頂上張望筋粗。 院中可真熱鬧,春花似錦炸渡、人聲如沸娜亿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽买决。三九已至沛婴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間督赤,已是汗流浹背嘁灯。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留躲舌,地道東北人丑婿。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像没卸,于是被迫代替她去往敵國和親羹奉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評論 2 359

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