利用运行时(Runtime)的方法交叉(Method Swizzling)检测控制器是否释放

1.Method Swizzling是什么?

方法交叉可以让你交换两个方法的实现,比如,现在有A、B两个方法,利用方法交叉之后,调用A方法,其实执行的是B方法的代码;执行B方法,执行的其实是A方法的代码

2.Method Swizzling用来干什么?

在无法修改系统或者是第三方框架的某些方法时,我们会自己写一个方法,然后利用Method Swizzling去交换系统或者框架的方法与自定义的方法的实体。这样,调用系统的方法时,其实就是执行我们自定义的方法。通过这样方式可以达到一些特殊的目的。比如,在项目开发中,控制器太多了,在每个控制器的dealloc方法打印相关信息很麻烦,可以自定义lca_delloc方法,利用Method Swizzling进行交换

3.Method Swizzling相关方法介绍

(1)Method class_getInstanceMethod(Class cls, SEL name)

      获得方法的实现

(2)void method_exchangeImplementations(Method m1, Method m2)

     交换两个方法的实现

4.Method Swizzling的使用案例

利用Method Swizzing检测控制器是否释放

给UIViewController添加一个分类,所有的控制器都能够使用了

#import "UIViewController+dealloc.h"

#import

@implementation UIViewController (dealloc)

#pragma mark - 当类第一次加载到内存的时候会调用这个方法,它要比main.m方法先执行

+(void)load{

Method method1 = class_getInstanceMethod([self class], NSSelectorFromString(@"dealloc"));

Method method2 = class_getInstanceMethod([self class], @selector(lca_dealloc));

method_exchangeImplementations(method1, method2);

}

#pragma mark - 自定义的dealloc方法

- (void) lca_dealloc{

NSLog(@"%s",__FUNCTION__);

//执行系统的dealloc方法,不会发生死循环,因为它会执行系统的dealloc方法

//我们可能会在系统的dealloc方法中执行一些释放操作,所以在自定义的dealloc方法中也要执行系统的

[self lca_dealloc];

}

@end

关于Method Swizzling在Swift中的使用需要注意的地方,请参考 nshipster.cn/swift-objc-runtime/

你可能感兴趣的:(利用运行时(Runtime)的方法交叉(Method Swizzling)检测控制器是否释放)