runtime是什么?
runtime又称运行时,也就是运行时候的一些机制,其中最总要的就是消息机制.
任何调用方法的本质都是发送消息
oc 与c 有什么不同?
c语言函数,在编译阶段就确定调用哪个函数
oc方法,在编译的时候并不能决定调用哪个方法,只有在真正运行的时候才会根据方法名称找到与之对应的函数实现
*注意:对于oc 来说是调用方法,对于c来说是调用函数.方法和函数是有区别的,对于oc根据方法名去找到函数名,相当于函数实现是方法的实现.函数名是函数实现的入口
在编译阶段,oc 中的方法只要声明就不会报错,而c中的函数必须实现,才不会报错.
runtime发消息
NSObject *p = [NSObject alloc];
p = [p init];
clang -rewrite-objc ViewController.m
如果报错看这里
这句话将ViewController.m代买转化成ViewController.cpp,oc代码转成c++代码
然后我们去ViewController.cpp看看6万多行代码,
搜索@implementation ViewController
NSObject *p = ((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("NSObject"), sel_registerName("alloc"));
p = ((NSObject *(*)(id, SEL))(void *)objc_msgSend)((id)p, sel_registerName("init"));
精简一下:
NSObject *p = objc_msgSend(objc_getClass("NSObject"), sel_registerName("alloc"));
p = objc_msgSend(p, sel_registerName("init"));
从上面代码我们看到,我们创建对象的本质其实就是发消息
objc_msgSend:发消息
objc_getClass : 获取类
sel_registerName:注册方法编号,相当于@selector() |