Runtime理解---方法调用和方法交换
2017-03-27 13:25
148 查看
Rruntime:
runtime底层方法调用,正常项目中OC 是不希望你去调用底层代码的,所以我们需要修改下配置文件(build settings 搜查msg 将bool修改为NO),之后创建一个Person类,并且创建一个eat方法具体实现demo
#import "Person.h" @implementation Person -(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 <objc/runtime.h> @implementation NSURL (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 - 运行时 理解和应用 字典转模型框架 AFN中的交换方法
- 理解 Delphi 的类(十) - 深入方法[9] - 调用时的括号
- 理解 Delphi 的类(十一) - 深入类中的方法[13] - 方法的调用约定
- 深入理解Javascript动态方法调用与参数修改的问题
- 【机房重构】方法调用---再小也要理解
- 如何通过方法调用交换两个变量的值
- c#几种方法调用的对比理解
- ios 中调用函数的方法是消息传递,这个和普通的函数调用的区别是,你可以随时对一个对象传递任何消息,而不需要在编译的时候声明这些方法。所以Objective-C可以在runtime的时候
- activity调用finish方法理解
- activity调用finish方法理解
- 理解动态代理的神器:InvocationHandler中invoke()方法的调用问题
- WWF中宿主程序(即调用工作流的程序)和工作流内部交换数据的几种方法(情况)。
- 使用Runtime.getRuntime().exec()的方法调用本地mysqldump.exe备份还原数据库(路径中含有空格和数字)的方法
- struts2 动态方法调用,动态方法调用的理解
- 利用runtime特性来动态调用方法
- 理解 Delphi 的类(十) - 深入方法[15] - 调用其他单元的函数
- 在Delphi中调用EXE文件,最简单、最容易理解的方法。
- xfire客户端调用远程服务出现:org.codehaus.xfire.XFireRuntimeException: Could not find operation xxx方法
- Python私有方法不能外部调用怎么理解?
- Java基于Runtime调用外部程序出现阻塞的解决方法