000-runtime简介

1、runtime的简介

  • Runtime简称运行时。OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是 消息机制。
  • 对于 C语言,函数的调用在编译的时候会决定调用哪个函数。
  • 对于 OC的函数,属于 动态调用过程,在编译的时候并不能决定真正调用那个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。
  • 事实证明:
    • 在编译阶段,OC可以调用任何函数,即使这个函数并未实现,只要声明过就不会报错。
    • 在编译阶段,C语言 调用 未实现的函数 就会报错

2、runtime的作用

  • 发送消息
    • 方法调用的本质,就是让 对象 发送消息
    • objc_msgSend,只有对象才能发送消息,因此以objc开头。
    • 使用 消息机制 前提,必须导入#import
    • 可是在终端中输入:clang -rewrite-objc main.m 来查看最终生成的代码

3、runtime的体验

  • OC来创建一个对象
//
//  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
    • 到工程 ->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 

@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

你可能感兴趣的:(000-runtime简介)