Method Swzzling缴挖,是指runtime的一個API方法
使用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添加這個隱藏的方法。
參考:http://www.cocoachina.com/ios/20160121/15076.html