还在愁一进公司不知道当前页面的 控制器是哪个嘛? runtim
2016-05-18 本文已影响153人
马爷
首先 第一个 就是创建一个 UIviewcontroller 的分类
其次就是
+ (void)load
{
//方法交换应该被保证 在程序中只能执行一次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//获取 viewcontroller 的生命周期方法
SEL systemMethod = @selector(viewWillAppear:);
SEL systemMethodDis = @selector(viewWillDisappear:);
//自己实现将要交换的方法
SEL changeMethod = @selector(statistics_viewWillAppear);
SEL changeMethodDis = @selector(statistics_viewWillDisappear);
//来个方法的 method
Method system = class_getInstanceMethod([self class], systemMethod);
Method change = class_getInstanceMethod([self class], changeMethod);
Method systemDis = class_getInstanceMethod([self class], systemMethodDis);
Method changeDis = class_getInstanceMethod([self class], changeMethodDis);
//首先动态添加方法 实现是被交换的方法 返回值表示成功或者失败
BOOL isAdd = class_addMethod(self, systemMethod, method_getImplementation(change), method_getTypeEncoding(change));
if (isAdd) {
//如果成功 说明类中不存在这个方法的实现
//将被交换方法的实现替换到这个并不存在的实现
class_replaceMethod(self, changeMethod, method_getImplementation(system), method_getTypeEncoding(system));
} else {
//交换来个方法的实现
method_exchangeImplementations(system, change);
}
BOOL isDis = class_addMethod(self, systemMethodDis, method_getImplementation(changeDis), method_getTypeEncoding(changeDis));
if (isDis) {
class_replaceMethod(self, changeMethodDis, method_getImplementation(systemDis), method_getTypeEncoding(systemDis));
} else {
method_exchangeImplementations(systemDis, changeDis);
}
});
}
- (void)statistics_viewWillAppear
{
NSLog(@"看我现在 进去 那个类了 %@", [self class]);
}
- (void)statistics_viewWillDisappear
{
NSLog(@"看我现在 出去 这个类了 %@", [self class]);
}