什么是method swizzling(俗稱黑魔法)贪惹?
簡(jiǎn)單說就是進(jìn)行方法交換当宴。
在Objective-C
中調(diào)用一個(gè)方法轰传,其實(shí)是向一個(gè)對(duì)象發(fā)送消息盗扒,查找消息的唯一依據(jù)是selector
的名字纱昧。利用Objective-C
的動(dòng)態(tài)特性刨啸,可以實(shí)現(xiàn)在運(yùn)行時(shí)偷換selector
對(duì)應(yīng)的方法實(shí)現(xiàn),達(dá)到給方法掛鉤的目的识脆。
每個(gè)類都有一個(gè)方法列表设联,存放著方法的名字和方法實(shí)現(xiàn)的映射關(guān)系,selector
的本質(zhì)其實(shí)就是方法名灼捂,IMP
有點(diǎn)類似函數(shù)指針离例,指向具體的Method
實(shí)現(xiàn),通過selector
就可以找到對(duì)應(yīng)的IMP
悉稠。
換方法的幾種實(shí)現(xiàn)方式:
- 利用
method_exchangeImplementations
交換兩個(gè)方法的實(shí)現(xiàn) - 利用
class_replaceMethod
替換方法的實(shí)現(xiàn) - 利用
method_setImplementation
來直接設(shè)置某個(gè)方法的IMP
method swizzling