美文网首页NSObject的前世今生iOSiOS程序猿
使用runtime交换系统类方法(神奇的swizzle)

使用runtime交换系统类方法(神奇的swizzle)

作者: 帅裂苍穹的七爷爷 | 来源:发表于2016-10-18 18:03 被阅读554次

我们之前说到,想要统计每个页面的启动时间。我们可以知道,每个页面都继承了UIViewController,假设每个页面开始启动的时间大概在LoadView的时候,结束启动的时间大概在在ViewDidAppear的时候。

问题1:

应该如何尽量少的改动原有代码实现这个功能呢?

回答:

因为每个页面都继承UIViewController,所以如果我们能够修改UIViewController的LoadView和ViewDidAppear方法就好了。

问题2:

但是UIViewController是系统类,如何修改系统类的实现?

回答:

可以参看我的文章深入浅出理解分类(category)和类扩展(extension),使用分类来重写LoadView和ViewDidAppear方法。同时重写+load方法,在其中实现分类loadView和本类loadView的代码互换。

下面我们可以通过一个例子来看看能否实现交换loadView和UIViewController。

1.创建一个UIViewController的分类。这个交换方法其实原理是runtime,所以要加入头文件<objc/runtime.h>

2.在其中重写LoadView和ViewDidAppear方法,注意不要取和本类同样的名字。然后写一个load方法,用于在加载时替换方法。

swizzle1.png

3.下面写一下交换方法的函数实现,基本写法是一样的,就写一个+ (void)swizzledLoadViewSel()的实现

swizzle2.png

4.这个时候还有一件事,在我们写的loadView_Swizzle以及ViewDidAppear_Swizzle中调用本类方法。因为我们不知道系统类怎么实现的,需要先调用父类的方法,再完成自己的实现。

swizzle2.5.png

5.下面让我们测试一下,首先我们有一个默认的ViewController,.m文件如下图所示:

swizzle3.png

6.我们运行一下,看一下控制台:

swizzle4.png

7.可以看出来,我们调用了分类里面写的LoadView和ViewDidLoad中的内容,完成了系统类方法和分类方法的交换。

相关文章

  • 使用runtime交换系统类方法(神奇的swizzle)

    我们之前说到,想要统计每个页面的启动时间。我们可以知道,每个页面都继承了UIViewController,假设每个...

  • runTime常用方法

    使用runTime改变实例成员的值 使用runtime来交换两个方法 注意再次调用该方法不交换 使用runTime...

  • 查看SDK调用支付宝参数

    使用runtime 方法交换openurl

  • Runtime

    runtime运行时机制1:通过runtime,实现方法交换(交换两个类方法、交换两个实例方法)2:通过runti...

  • Day3

    1 runtime运行时机制1:通过runtime,实现方法交换(交换两个类方法、交换两个实例方法)。2:通过ru...

  • 2018-01-01

    苹果的swizzle,利用runtime进行方法交换. 例子1.在网络请求中,一个url如果不合法但执行结果错误,...

  • iOS 开发之runtime使用小结

    我们一般用runtime做以下这些事情: 一、使用runtime如何交换两个方法的实现,拦截系统自带的方法调用功能...

  • 在不同类之间实现Method Swizzling

    首先,获取目标类方法,即当前类交换方法 然后向目标类中新添加一个新方法 注意,添加完方法后,需要更新swizzle...

  • ios - runtime运行时应用---交换方法

    runtime运行时用法之一 --- 交换类的方法,此处简单写了把系统的UIView的setBackgroundC...

  • ios - runtime运行时应用---交换方法

    runtime运行时用法之一 --- 交换类的方法,此处简单写了把系统的UIView的setBackgroundC...

网友评论

    本文标题:使用runtime交换系统类方法(神奇的swizzle)

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