美文网首页
OC方法转化

OC方法转化

作者: zelo | 来源:发表于2017-10-12 15:39 被阅读10次

在OC编码中,有一种黑魔法,当你想截获一个方法,想在这个方法中添加一点你需要的东西,但是又不能改这个这个方法。可以利用runtime中的方法获取这个方法,通过方法转换,把你的方法插入到这个方法中去。

    //
    SEL originalSelector = @selector(actionForLayer:forKey:);
    SEL extendedSelector = @selector(DR_actionForLayer:forKey:);

    Method originalMethod = class_getInstanceMethod(self, originalSelector);
    Method extendedMethod = class_getInstanceMethod(self, extendedSelector);

    NSAssert(originalMethod, @"original method should exist");
    NSAssert(extendedMethod, @"exchanged method should exist");

    if(class_addMethod(self, originalSelector, method_getImplementation(extendedMethod), method_getTypeEncoding(extendedMethod))) {
        class_replaceMethod(self, extendedSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
    } else {
        method_exchangeImplementations(originalMethod, extendedMethod);
    }

或者用下面的方法

 +(void)load{
    /** 获取原始setBackgroundColor方法 */
    Method originalM = class_getInstanceMethod([self class], @selector(setBackgroundColor:));

    /** 获取自定义的pb_setBackgroundColor方法 */
    Method exchangeM = class_getInstanceMethod([self class], @selector(pb_setBackgroundColor:));

    /** 交换方法 */
    method_exchangeImplementations(originalM, exchangeM);
    
}
    
    
    
    /** 自定义的方法 */
-(void)pb_setBackgroundColor:(UIColor *) color{

    NSLog(@"%s",__FUNCTION__);

    /** 
     1.更改颜色
     2.所有继承自UIView的控件,设置背景色都会设置成自定义的'orangeColor'
     3. 此时调用的方法 'pb_setBackgroundColor' 相当于调用系统的 'setBackgroundColor' 方法,原因是在load方法中进行了方法交换.
     4. 注意:此处并没有递归操作.
     */
    [self pb_setBackgroundColor:[UIColor orangeColor]];
}

相关文章

  • OC方法转化

    在OC编码中,有一种黑魔法,当你想截获一个方法,想在这个方法中添加一点你需要的东西,但是又不能改这个这个方法。可以...

  • 探索objc_msgSend函数的实现流程

    熟悉OC语言的Runtime(运行时)机制以及对象方法调用机制的开发者都知道,所有OC方法调用在编译时都会转化为对...

  • 消息转发以及实际开发中的用途

    OC中的方法调用,其实都是转化成objc_msgSend函数调用 1.信息发送 2.动态方法解析 /// 对象消息...

  • OC中方法@selector()的本质是什么?

    OC中对象方法调用时,会转化为Objc_msgSend(self, SEL, ...)函数,然后通过SEL在类对象...

  • 消息转发

    OC中的方法调用,其实都是转化成objc_msgSend函数调用 1.信息发送 2.动态方法解析 /// 对象消息解析

  • runTime一点点理解

    OC底层的初步理解 OC是是一门运行时运行会在运行时动态的获去属性和方法 调用方法编译时会被转化为消息发送 Cla...

  • objc_msgSend的汇编理解

    了解OC语言Runtime机制的开发者都知道,几乎所有的方法调用都会转化成objc_msgSend(void /*...

  • iOS的消息机制

    一 、简介: OC的方法调用,在底层会被转化为消息发送的形式.形如: 关于objc_msgSend()的文档在苹果...

  • iOS 常见面试题 -- Runtime

    OC中方法的调用 其实都是转化为 objc_msgSend函数的调用 objc_msgSend函数的执行流程可以分...

  • From Objective-C to Ruby(3)-方法和块

    方法 定义方法 OC: ruby: 调用方法 OC: ruby: 参数的默认值 OC: 方法的返回值 OC: ru...

网友评论

      本文标题:OC方法转化

      本文链接:https://www.haomeiwen.com/subject/vzcoyxtx.html