首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

RunTime(1)

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()
返回列表