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<objc/runtime>
@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/
网友评论