Board logo

标题: RunTime(1) [打印本页]

作者: look_w    时间: 2019-3-3 19:47     标题: RunTime(1)

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()




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0