runtime.
中文翻译:运行时刻.
Objective-C是一门动态语言,运行时会转换成C语言.
例如:[object method];(编译时)
转换成:objc_msgSend(object, @selector(method));(运行时)
场景一:
[btn addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];
当你没写click方法的时候,编译的时候会提示找不到click方法.
当你运行的时候,点击按钮,程序会崩溃.
崩溃之前程序做了几件事情.
1.在拥有btn类的方法缓存列表中找了一遍是否有这个方法(方法缓存简介:方法缓存是为了优化性能,而优化是永无止境的.链接:http://www.cocoachina.com/ios/20150818/13075.html)
2.在拥有btn类的父类中查找一遍是否有该方法.
3.在拥有btn类的根类中查找一遍是否有该方法.
4.看是否有拦截调用的方法.
123我们不考虑,4是runtime入门的一个点.
+ (BOOL)resolveInstanceMethod:(SEL)sel;
这样点击,程序没有崩溃.
假设程序响应命令是0转变为1的过程,我们知道了是可以在这个过程里做一些事情的.
例如:交换点击事件(这样做并没有意义,只是举个例子),A按钮的点击却实现的B按钮的点击事件
交换的原理是:交换指针指向
运行时交换方法,有点像面向切面编程(动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程)
但是我觉得交换方法特别容易乱,交换完要换回来,除非你打算交换完就不换回来,一直使用,不过那样就失去了交换的意义.
建议大家看看Mattt Thompson(AFNetwoking的创作者/维护者)
写的Method Swizzling:http://nshipster.cn/method-swizzling
专门讲述了方法交换以及注意的点
网友评论