原理:
在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è)方法列表,存放著selector的名字和方法實(shí)現(xiàn)的映射關(guān)系。IMP有點(diǎn)類似函數(shù)指針,指向具體的Method實(shí)現(xiàn)。
我們可以利用 method_exchangeImplementations 來(lái)交換2個(gè)方法中的IMP。
例:
重寫NSUserDefaults的讀寫方法,將原來(lái)的(setObject:forKey:)方法,替換成自定義的方法,如(cySwizzlingSetObject:forKey:)
然后交換自定義方法和系統(tǒng)方法,如下:
```
Method?originalMethod?=?class_getInstanceMethod([NSUserDefaults?class],??@selector(setObject:forKey:));??
Method cySwizzledMethod?=?class_getInstanceMethod([NSUserDefaults?class],?@selector(cySwizzleSetObject:forKey:));??
?method_exchangeImplementations(originalMethod, cySwizzledMethod);?
```