版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_18683985/article/details/82470374
交换系统方法也属于runtime的一部分
1.首先导入runtime
#import <objc/runtime.h>
2.取出系统方法与你写的方法
Method systemMethod = class_getInstanceMethod(self, @selector(systemMethod));
Method my_Method = class_getInstanceMethod(self, @selector(my_Method));
3.交换方法
method_exchangeImplementations(systemMethod, my_Method);
注:
1.对于一般的Class.推荐交换load方法
+ (void)load {
Method systemMethod = class_getInstanceMethod(self, @selector(systemMethod));
Method my_Method = class_getInstanceMethod(self, @selector(my_Method));
method_exchangeImplementations(systemMethod, my_Method);
}
2.调用需要调用先使用系统的方法初始化调用[self xxx]的系统方法的时候.需要把xxx改成my_xxx(你交换的方法)
这里是因为你的方法已经和系统的方法交换了,调用你的方法其实是调用的系统方法,调用系统方法的话就调用的是你的方法,然后就会产生循环引用.
///例如
- (void)layoutSubviews {
[super layoutSubviews];
}
- (void)my_layoutSubviews {
///// 如果这么写,调用的就是my_layoutSubviews.就会循环引用.
//[self layoutSubviews];
// 正确写法
[self my_layoutSubviews];
}