1、runtime的简介
- Runtime简称运行时。OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是 消息机制。
- 对于 C语言,函数的调用在编译的时候会决定调用哪个函数。
- 对于 OC的函数,属于 动态调用过程,在编译的时候并不能决定真正调用那个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。
- 事实证明:
- 在编译阶段,OC可以调用任何函数,即使这个函数并未实现,只要声明过就不会报错。
- 在编译阶段,C语言 调用 未实现的函数 就会报错
2、runtime的作用
- 发送消息
- 方法调用的本质,就是让 对象 发送消息
- objc_msgSend,只有对象才能发送消息,因此以objc开头。
- 使用 消息机制 前提,必须导入#import<objc/message.h>
- 可是在终端中输入:clang -rewrite-objc main.m 来查看最终生成的代码
3、runtime的体验
//
// ViewController.m
// 000-runtime(消息机制的体现)
//
// Created by 紫荆秋雪 on 2017/2/24.
// Copyright © 2017年 Revan. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//OC创建一个对象的实现如下
NSObject *objc = [[NSObject alloc] init];
NSLog(@"%@", objc);
}
@end
- 下面来看如何使用runtime来实现同样一个创建对象的过程
- 首先要导入:#import <objc/message.h>
- 到工程 ->Build Settings搜索msg设置:Enable Strict Checking of objc_msgSend Calls 为 NO,这样在输入runtime的C语言方法时就会有代码提示
//
// ViewController.m
// 000-runtime(消息机制的体现)
//
// Created by 紫荆秋雪 on 2017/2/24.
// Copyright © 2017年 Revan. All rights reserved.
//
#import "ViewController.h"
#import <objc/message.h>
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//OC创建一个对象的实现如下
//NSObject *objc = [[NSObject alloc] init];
//NSLog(@"%@", objc);
//1、首先要分配一个内存空间
/**
* [NSObject alloc]这句代码在底层调用的代码过程
* 第一个参数:调用方法的 对象
* 第二个参数:对象 调用那个 方法
*/
id objc = objc_msgSend([NSObject class], @selector(alloc));
// 初始化
objc = objc_msgSend(objc, @selector(init));
NSLog(@"%@", objc);
}
@end