利用Method Swizzling 来抽取重复的操作

利用Method Swizzling 来抽取重复的操作

by 伍雪颖

重复操作如数据上报,公共特性等等.

1.建立UIViewController的Category

2.代码:

#import "UIViewController+Analytics.h"
#import <objc/runtime.h>

@implementation UIViewController (Analytics)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class class = [self class];
        SEL originalSelector = @selector(viewWillAppear:);
        SEL swizzledSelector = @selector(ana_viewWillAppear:);

        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)ana_viewWillAppear:(BOOL)animated {
    [self ana_viewWillAppear:animated];
    NSLog(@"ana_viewWillAppear");
    NSLog(@"%@",self);
    MTA_Report();
    [self hideNavigationShadowLine];
}

@end

3.输出

2015-06-16 09:17:59.838 Test[37292:2748514] ana_viewWillAppear

2015-06-16 09:17:59.838 Test[37292:2748514] ViewController: 0x7fb7515291c0>

时间: 2024-10-02 02:29:19

利用Method Swizzling 来抽取重复的操作的相关文章

ios method swizzling

阅读器 iOS开发iOS 本文由TracyYih[博客]翻译自NSHipster的文章Method Swizzling. 在上周associated objects一文中,我们开始探索Objective-C运行时的一些黑魔法.本周我们继续前行,来讨论可能是最受争议的运行时技术:method swizzling. Method swizzling指的是改变一个已存在的选择器对应的实现的过程,它依赖于Objectvie-C中方法的调用能够在运行时进改变——通过改变类的调度表(dispatch tab

Method Swizzling实现原理

在上周associated objects一文中,我们开始探索Objective-C运行时的一些黑魔法.本周我们继续前行,来讨论可能是最受争议的运行时技术:method swizzling. Method swizzling指的是改变一个已存在的选择器对应的实现的过程,它依赖于Objectvie-C中方法的调用能够在运行时进改变——通过改变类的调度表(dispatch table)中选择器到最终函数间的映射关系. 举个例子,假设我们想跟踪在一个iOS应用中每个视图控制器展现给用户的次数: 我们可

ObjC Runtime 黑魔法 — Method Swizzling

适用情境 项目中大量控制器需要在载入时进行日志统计或进行类似的处理.如果直接往所有控制器中进行代码编写,会产生大量的重复的代码,降低了代码后期的可读性,不利于维护.由于所有部分的逻辑代码相同,针对这种情况,以切面编程(AOP)思想为导向,利用 Method Swizzling 能极大降低这种(日志统计)非主要逻辑代码与控制器的耦合度. AOP概念详解(摘自百度百科) 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理

Objective-C的hook方案(一): Method Swizzling

原文地址:http://blog.csdn.net/yiyaaixuexi/article/details/9374411 Objective-C的hook方案(一):  Method Swizzling 在没有一个类的实现源码的情况下,想改变其中一个方法的实现,除了继承它重写.和借助类别重名方法暴力抢先之外,还有更加灵活的方法吗?在Objective-C编程中,如何实现hook呢?标题有点大,计划分几篇来总结. 本文主要介绍针对selector的hook,主角被标题剧透了———— Method

Objective-C Runtime 运行时之四:Method Swizzling

理解Method Swizzling是学习runtime机制的一个很好的机会.在此不多做整理,仅翻译由Mattt Thompson发表于nshipster的Method Swizzling一文. Method Swizzling是改变一个selector的实际实现的技术.通过这一技术,我们可以在运行时通过修改类的分发表中selector对应的函数,来修改方法的实现. 例如,我们想跟踪在程序中每一个view controller展示给用户的次数:当然,我们可以在每个view controller的

iOS黑魔法-Method Swizzling

公司年底要在新年前发一个版本,最近一直很忙,好久没有更新博客了.正好现在新版本开发的差不多了,抽空总结一下.由于最近开发新版本,就避免不了在开发和调试过程中引起崩溃,以及诱发一些之前的bug导致的崩溃.而且项目比较大也很不好排查,正好想起之前研究过的Method Swizzling,考虑是否能用这个苹果的“黑魔法”解决问题,当然用好这个黑魔法并不局限于解决这些问题...... 需求 就拿我们公司项目来说吧,我们公司是做导航的,而且项目规模比较大,各个控制器功能都已经实现.突然有一天老大过来,说我

Objective-C Runtime 运行时之四:Method Swizzling(转载)

理解Method Swizzling是学习runtime机制的一个很好的机会.在此不多做整理,仅翻译由Mattt Thompson发表于nshipster的Method Swizzling一文. Method Swizzling是改变一个selector的实际实现的技术.通过这一技术,我们可以在运行时通过修改类的分发表中selector对应的函数,来修改方法的实现. 例如,我们想跟踪在程序中每一个view controller展示给用户的次数:当然,我们可以在每个view controller的

利用反射技术实现POJO的数据库操作

记得第一次写项目的时候,傻傻的数据库一张表,代码里就写一个DAO类,几张表就写几个DAO类,大量的重复代码,自己粘着都嫌烦,后来接触了Hibernate,不得不说对我们这种小白用处还是很大的,那么多的实体类,一个DAO就可以实现基本的数据库操作了,于是我用的不亦乐乎,但到底是怎么做的,从来没有考虑过,现在用这些框架已经有一段时间了,原谅我脑洞大开,想自己实现一下这种类似的功能: 在准备写之前,我们需要一些规则: 1.由实体类名,可以知道我这个类是存放在哪张表里---这里我采用的是和t_类名 2.

理解Objective-C Runtime(四)Method Swizzling

Objective-C对象收到消息之后,究竟会调用何种方法需要在运行期间才能解析出来.那你也许会问:与给定的选择子名称相应的方法是不是也可以在runtime改变呢?没错,就是这样.若能善用此特性,则可发挥出巨大优势,因为我们既不需要源代码,也不需要通过继承子类来覆写方法就能改变这个类本身的功能.这样一来,新功能将在本类的所有实例中生效,而不仅限于覆写了相关方法的那些子类实例.此方案就是大名鼎鼎的「method swizzling」,中文常称之为『方法调配』或『方法调和』或『方法混合』. Meth