美文网首页
runtime(交换两个方法的实现,拦截系统自带方法调用功能)

runtime(交换两个方法的实现,拦截系统自带方法调用功能)

作者: 握青春 | 来源:发表于2016-11-28 15:31 被阅读0次

导入<objc/runtime.h>

1. 获得某个类的类方法

Method m1 = class_getClassMethod(Class cls , SEL name)

2.获得某个类的实例对象的方法

Method m2 = class_getInstanceMethod(Class cls , SEL name)

3. 交换两个方法

 method_exchangeImplementations(Method m1 ,

Method m2)

暂时没用到,用网上的一个栗子:

创建一个Dog类,

+ (void)eat {

NSLog(@"eat");

}

+ (void)run {

NSLog(@"run");

}

[Dog eat]; [Dog fuck]; 先吃后跑,使用

Method m1 = class_getClassMethod(Dog Class ,@selector(eat));

Method m2 = class_getClassMethod(Dog Class ,@selector(eat));

method_exchangeImplementations(m1, m2);// 交换后,先打印学习,再打印跑!

 [Dog eat]; [Dog fuck];

案例2:

系统的拦截方法:(比较老的例子)

iOS6和iOS7扁平和拟物化加载扁平和拟物风格, 不通过手动一个个修改imageNamed 就可以加入版本判断语句.(这句话没懂)

新建 UIImage + Category,

在分类中实现一个自定义的方法,加入你的需求,比如

+ (UIImage *)xl_imageNamed:(NSString *)name {

double version = [[UIDevice currentDevice].systemVersion doubleValue]; 

if (version >= 7.0) { 

 // 如果系统版本是7.0以上,使用另外一套文件名结尾是‘_os7’的扁平化图片          name = [name stringByAppendingString:@"_os7"];

}

return [UIImage xh_imageNamed:name]; 

// 调用一下系统的方法让其有原来方法的功能,因为已经交换过,所以显示的是新的方法

}

3、分类中重写UIImage的load方法,实现方法的交换(只要能让其执行一次方法交换语句,load再合适不过了)  

+ (void)load { 

 // 获取两个类的类方法    

  Method m1 = class_getClassMethod([UIImage class],  @selector(imageNamed:));     

 Method m2 = class_getClassMethod([UIImage class],  @selector(xh_imageNamed:)); 

// 开始交换方法实现     

 method_exchangeImplementations(m1, m2); 

}

利用以上思路,我们还可以给 NSObject 添加分类,统计创建了多少个对象,给控制器添加分类,统计有创建了多少个控制器,特别是公司需求总变的时候,在一些原有控件或模块上添加一个功能,建议使用该方法!

// 这句话要好好理解,可以增加自己思路广度

相关文章

  • iOS 开发之runtime使用小结

    我们一般用runtime做以下这些事情: 一、使用runtime如何交换两个方法的实现,拦截系统自带的方法调用功能...

  • 转:Runtime的使用

    一、交换两个方法的实现,拦截系统自带的方法调用功能 需要用到的方法 获得某个类的类...

  • runtime理解笔记

    .一、交换两个方法的实现,拦截系统自带的方法调用功能 需要用到的方法 获得某个类的类方法 Method class...

  • iOS runtime

    这里先给大家看一些小实例,在后面我会简单剖析一下原理。 一、交换两个方法的实现,拦截系统自带的方法调用功能。 首先...

  • 有了这些ios面试技巧,公司任你进

    利用runtime 可以做一些OC不容易实现的功能 1,动态交换两个方法的实现(特别是交换系统自带的方法) 2,动...

  • runtime实用

    Runtime常见应用场景 具体应用拦截系统自带的方法调用(Method Swizzling黑魔法) 实现给分类增...

  • runtime(交换两个方法的实现,拦截系统自带方法调用功能)

    导入 1. 获得某个类的类方法 Method m1 = class_getClas...

  • iOS类与方法底层探析(四)-方法调用RunTime的具体应用

    RunTime的具体应用: 具体应用拦截系统自带的方法调用(Method Swizzling黑魔法) 给分类添加属...

  • runTime常用方法

    使用runTime改变实例成员的值 使用runtime来交换两个方法 注意再次调用该方法不交换 使用runTime...

  • 消息转发机制

    RunTime: 1、获取所有的属性列表、方法列表、协议列表 2、方法交换 3、方法拦截调用,容错处理 4、动态添...

网友评论

      本文标题:runtime(交换两个方法的实现,拦截系统自带方法调用功能)

      本文链接:https://www.haomeiwen.com/subject/ujrwpttx.html