美文网首页
Runtime理解---方法调用和方法交换

Runtime理解---方法调用和方法交换

作者: 没用的阿吉12 | 来源:发表于2018-01-12 10:07 被阅读0次

Runtime:

runtime底层方法调用,正常项目中OC 是不希望你去调用底层代码的,所以我们需要修改下配置文件(build settings 搜查msg 将bool修改为NO),之后创建一个Person类,并且创建一个eat方法 

具体实现:https://github.com/liyunhe/RuntimeStudy

#import"Person.h"@implementationPerson-(void)eat{

    NSLog(@"调用我了");

}@end

利用 objc_msgSend调用eat方法

Person *p = [[Person alloc] init];

  objc_msgSend(p, @selector(eat));

下面我们尝试不适用OC 上层代码调用具体代码如下

//创建对象NSObject* p = objc_msgSend(objc_msgSend(objc_getRequiredClass("Person"),@selector(alloc)),@selector(init));  //调用方法objc_msgSend(p,@selector(eat));

验证是否是底层代码 

1.创建一个command line Lauguage 选中OC  

2.利用终端cd到main.c所在目录 

3.执行clang -rewrite-objc main.m  

4.找到main.cpp 

如下是OC 底层实现代码

int main(int argc, const char * argv[]) {

    /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool;

        Person * p = ((Person *(*)(id, SEL))(void *)objc_msgSend)((id)((Person *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("Person"), sel_registerName("alloc")), sel_registerName("init"));

        NSLog((NSString *)&__NSConstantStringImpl__var_folders_7s_75jn6mvs2_xfh3v7hmq7v0140000gn_T_main_2edfc3_mi_0);

    }

    return 0;

}

方法交换

当项目中需要大的修改 或者某个方法有存在问题一般会用到 

项目中如果url不符合规则就会url =nil,下面为URLWithString 添加一个筛选条件可以更清楚地定位到问题,为系统类的方法添加工程我们一般都会使用扩展类。添加NSURL+Url.H

NSURL * url = [NSURL URLWithString:@"中文"];

具体代码:

#import"NSURL+Url.h"#import@implementationNSURL(Url)//+(instancetype)URLWithString:(NSString *)URLString{//}+(instancetype)YH_URLWithStr:(NSString *)str{

    NSURL *url = [NSURL YH_URLWithStr:str];

    if (url==nil) {

        NSLog(@"url为Nil");

    }

    return url;

}

+(void)load{

    //交换方法    //method 成员方法//    class_getClassMethod 获取类方法//    class_getInstanceMethod 获取静态方法    Method urlWithUrl = class_getClassMethod(self, @selector(URLWithString:));

    Method YH_URLWithStr = class_getClassMethod(self, @selector(YH_URLWithStr:));

    method_exchangeImplementations(urlWithUrl, YH_URLWithStr);

}

相关文章

  • Runtime理解---方法调用和方法交换

    Runtime: runtime底层方法调用,正常项目中OC 是不希望你去调用底层代码的,所以我们需要修改下配置文...

  • runTime常用方法

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

  • Runtime应用之交换方法实现

    Runtime一个常用的场景是交换方法的调用。其实就是利用了Runtime的方法交换,具体代码如下: 核心思路是先...

  • Runtime(一)方法交换

    Runtime的常用方法(交换方法) 举个简单的例子就是在我们调用UIImage的imageNamed方法时判断加...

  • +initialize和+load的区别

    +load方法 load方法会在runtime加载类、分类时调用 ( 常在这里做 方法交换 Method Swiz...

  • 消息转发机制

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

  • runtime

    runtime交换方法 动态添加方法

  • iOS 开发之runtime使用小结

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

  • objc runtime (四)动态添加属性

    在《objc runtime (二)交换方法》中我提到过runtime最实用的就是交换方法和动态添加属性两个用法。...

  • iOS 防止方法未实现造成的崩溃

    实现原理基于runtime的方法交换和消息发送机制 方法交换 method_exchangeImplementat...

网友评论

      本文标题:Runtime理解---方法调用和方法交换

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