摘要:本文将带你了解IOS开发入门iOS黑魔法之Method Swizzling,希望本文对大家学IOS有所帮助。
本文将带你了解IOS开发入门iOS黑魔法之Method Swizzling,希望本文对大家学IOS有所帮助。
此黑魔法本应属于OC,它是基于Runtime实现的偷天换日大法。
那么什么是Method Swizzling呢?从字面意思来看叫方法协调,大概就是这个意思了。使用此魔法可以替换现有方法为自定义方法,来个偷天换日,偷梁换柱。
使用方法很简单,代码基本为以下框架。但其具有较强的魔力,这是一个方法hook啊。
/**
* Method Swizzling
* 黑魔法之偷天换日
*/
#import "UIViewController+Extension.h"
#import <objc runtime.h="">
@implementation UIViewController (Extension)
// 为了保证一定执行 把代码放到+ (void)load;里
+ (void)load {
[super load];
// 线程安全 只执行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 获取class
Class class = [self class];
// Class class = object_getClass((id)self);
// 封装selector
SEL originalSelector = @selector(viewWillAppear:);
SEL swizzledSelector = @selector(lw_viewWillAppear:);
// 封装方法
Method originalMethod = class_getInstanceMethod(class, originalSelector);
Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
// 添加方法
BOOL methodDidAdd = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
if(methodDidAdd) {
// 替换方法
class_replaceMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
}else {
// 交换方法
method_exchangeImplementations(originalMethod, swizzledMethod);
}
});
}
#pragma mark - 自定义的魔法方法
- (void)lw_viewWillAppear:(BOOL)animated {
[self lw_viewWillAppear:animated];
NSLog(@"BLack Magic");
}
</objc>
注意:
1 + (void)load;
2 dispatch_once;
3 [self lw_viewWillAppear:animated]; // 不回死循环 若为[self viewWillAppear:animated];死循环
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号