iOS 黑魔法-Method Swizzling

原理:

在Objective-C中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。利用Objective-C的动态特性,可以实现在运行时偷换selector对应的方法实现,达到给方法挂钩的目的。

每个类都有一个方法列表,存放着selector的名字和方法实现的映射关系。IMP有点类似函数指针,指向具体的Method实现。

我们可以利用 method_exchangeImplementations 来交换2个方法中的IMP。


例:

重写NSUserDefaults的读写方法,将原来的(setObject:forKey:)方法,替换成自定义的方法,如(cySwizzlingSetObject:forKey:)

然后交换自定义方法和系统方法,如下:

```

Method originalMethod = class_getInstanceMethod([NSUserDefaults class],  @selector(setObject:forKey:));  

Method cySwizzledMethod = class_getInstanceMethod([NSUserDefaults class], @selector(cySwizzleSetObject:forKey:));  

 method_exchangeImplementations(originalMethod, cySwizzledMethod); 

```

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,814评论 0 9
  • 刚开始学习IOS的时候,听说黑魔法很强大,正如它的名字一样,可以做很多不可思议的事情,一直到今天才彻底静下心去了解...
    东了个尼阅读 1,745评论 0 3
  • 场景需求:在没有一个类的实现源码的情况下,想改变其中一个方法(一般指系统的方法)的实现,除了继承它重写、和借助类别...
    船长_阅读 2,141评论 0 17
  • 转载:http://www.cocoachina.com/ios/20161102/17920.html 因为Ob...
    F麦子阅读 674评论 0 1
  • 前言: 今天我们再来了解另外一个体现OC动态特性的技术,向来有IOS黑魔法之称的Method Swizzling,...
    cxlhaha阅读 732评论 0 3