对于我来说解释Runtime是一件很困难的事情,你现在让我给你讲清楚也很难,即使看了sunnyxx的Runtime分享还有一些博客文章。
写这篇文章很多都来自大神的思考和实践,在最后我会去分享资源来源,有一些是我个人的感觉.目的两个让自己再次梳理一下,第二个是需要成长.
如果当你好好学习C语言和C++语言的话,我觉得更善于去理解底层为什么这么去实现.
但是像我这种没有底层语言的学习怎么办呢?一些函数只能靠记忆,好在因为C语言那些东西还真得记,因为不是面向对象.
现在我认为Runtime对于我的作用有以下两点
1.让我更好的了解当我们调用方法、属性时候系统为我们做了什么;
2.如何去优化我们的app。
以下是我现在理解到一些点上和整理的一些信息,至于知识我还需要消化,希望大家去我在文章尾巴上面提供的几个地址看一下大神如何理解的
1/objc中的对象是什么?对象实例是什么?
一个指向ClassObject的地址的变量(id obj = &ClassObject);
对象实例变量 *void ivar = &obj + offset(N)
2/ [obj foo] ->编译成 obj_sendMsg(obj,"foo")->去找方法(本类先查询是否有这个方法, 若没有去父类查找;本类发现响应会放置在cache里面,每次回先从cache里面寻找若没有继续父类查找)
3/类及相应meta-class类的一个继承体系,如图所示
4/黑魔法 --Method Swizzling (源自:http://nshipster.com/method-swizzling/)
1.改变一个selector的实际实现的技术
2.总在load中执行
3.总在dispatch_once中执行
+(void)load
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [self class];
//获取SEL
SEL originalSelector = @selector(viewWillAppear:);
SEL swizzledSelector = @selector(my_viewWillAppear:);
//获取Method
Method orginalMethod = class_getInstanceMethod(class, originalSelector);
Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
//判断方法之前是否添加
BOOL didAddMethod = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
//交换方法
if (didAddMethod) {
class_replaceMethod(class, originalSelector, method_getImplementation(orginalMethod), method_getTypeEncoding(orginalMethod));
}else{
method_exchangeImplementations(orginalMethod, swizzledMethod);
}
});
}
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)viewWillAppear:(BOOL)animated{
}
-(void) my_viewWillAppear:(BOOL)animated{
NSLog(@"改变了执行");
}
5/Class 完全体 (来源:sunnyxx Runtime keynote)
6/学习资源
1.南峰子博客(http://southpeak.github.io/blog/2014/10/25/objective-c-runtime-yun-xing-shi-zhi-lei-yu-dui-xiang/)
2.sunnyxx博客和视频(http://blog.sunnyxx.com/ )
3.nshipster.com/(http://nshipster.com/method-swizzling/)