我下面要将的内容也许网上已经有很多相关的介绍了,但是我还是会写出这篇文章,一来是对自己学习的总结,虽然总结的有些晚,如果你仔细看,会发现我的文章有别处没有的内容介绍,而且都是亲测过的。
`如何在一个大的项目中使所有的 VC 都在试图将要出现的时候打印出当前类的名称,而且要不影响到原有方法的执行?
思考
这样我们的目的就实现了。
使用class_getClassMethod 一直失败,知道原因后会更新使用这个方法的示例。 这里解释下上面的方法,它的目的是为了使用一个重写的方法替换掉原来的方法。但被重写的方法可能是在父类中重写的,也可能是在子类中重写的。 对于第一种情况,应当先在目标类增加一个新的实现方法,class_addMethod:如果发现方法已经存在,会失败返回,如果返回成功:则说明被替换方法没有存在,我们需要先把这个方法实现,然后再用我们自定义的方法去替换被替换的方法。这样的逻辑判断是比价安全的,因为消息转发机制的存在,当前类没有系统方法的实现即系统方法实现在父类时,class_getInstanceMethod会返回父类的实现,如果直接调用method_exchangeImplementations,则会替换掉父类的实现,而不是当前类的实现,则不能达到预期的效果。
** 注意:要说明一下,上述方法实现了方法的拦截和替换,但是因为是在类别中实现的所以替换的是UIViewController中的方法,而很多其它 VC都是继承自 UIViewController,因为 [Super viewWillAppear ]的存在你会发现,其它的VC中还是会执行它自己viewWillAppear 的类容,因为你拦截并换的只是它父类中的viewWillAppear而不是它本身的viewWillAppear。**