iOS-Runtime方法交换

作者: FlyElephant | 来源:发表于2016-06-25 15:16 被阅读673次

iOS开发中需要在原有的方法之后执行新的方法,如果我们想在UIController中的viewWillAppear之后执行其他的操作,或者说需要重写原有的设置颜色,位置等操作,都可以通过方法交换实现,实际操作也很简单,通过分类方法中的load方法实现:
<pre><code>`
@implementation UIViewController (FlyElephant)

+(void)load{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [self class];

    SEL originalSelector = @selector(viewWillAppear:);
    SEL swizzledSelector = @selector(fe_viewWillApper:);
    
    Method originalMethod = class_getInstanceMethod(class, originalSelector);
    Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
    
    BOOL success = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
    if (success) {
        class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
    } else {
        method_exchangeImplementations(originalMethod, swizzledMethod);
    }
});

}

-(void)fe_viewWillApper:(BOOL)animated{
NSLog(@"FlyElephant--fe_viewWillApper");
}

@end`</code></pre>

FlyElephant.png

方法交换的时候有两点是需要注意的:
1.如果原有的父类中是没有定义的原始方法,那么originalSelector没有对应的执行方法,所以我们需要通过class_method将替换方法实现给originalSelector,看到网上有人没有判断直接进行交换是不正确的实现;
2.如果originalSelector对应的有执行,简单替换即可;

如果对iOS方面有技术问题可以加入228407086群与我交流~

相关文章

  • iOS-Runtime方法交换

    iOS开发中需要在原有的方法之后执行新的方法,如果我们想在UIController中的viewWillAppear...

  • 壹、面试复习OC篇之runtime

    暂时copy过来,过后添加自己理解 原文地址:iOS-runtime通篇详解-上 iOS-runtime通篇详解-...

  • iOS开发 runtime理解

    http://yimouleng.com/2015/05/28/ios-runtime/

  • iOS 方法交换

    交换类方法 交换实例方法

  • iOS -- runtime的应用

    runtime主要有一下几种应用场景 方法交换 添加属性 (一)方法交换 (1)字体适配 方法交换实际交换的是方法...

  • ios-runtime添加方法

    runtime官方Objective-C Runtime Programming Guide - Dynamic ...

  • iOS-Runtime方法说明

    收 集 文 章 / 超 人文章出处 Rumtime方法说明 获取类的类名 获取类的父类 class_getSup...

  • iOS 方法交换 method_exchangeImplemen

    方法交换 使用方法交换需要注意些什么呢 1、在交换系统方法后要注意结束前调用本方法,也就是执行系统方法 2、再交换...

  • OC runtime 底层API解析

    关于class的API 交换方法API 替换方法的实现 交换方法的实现

  • 交换方法

    利用runtime可以修改系统的方法实现,这种方式无任何侵入性,因此也是很多第三方常用的技术。它的解决具有全局性;...

网友评论

    本文标题:iOS-Runtime方法交换

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