1诱告、runtime的簡介
- Runtime簡稱運行時。OC就是運行時機制吠架,也就是在運行時候的一些機制芙贫,其中最主要的是 消息機制。
- 對于 C語言傍药,函數(shù)的調(diào)用在編譯的時候會決定調(diào)用哪個函數(shù)磺平。
- 對于 OC的函數(shù),屬于 動態(tài)調(diào)用過程拐辽,在編譯的時候并不能決定真正調(diào)用那個函數(shù)拣挪,只有在真正運行的時候才會根據(jù)函數(shù)的名稱找到對應的函數(shù)來調(diào)用。
- 事實證明:
- 在編譯階段俱诸,OC可以調(diào)用任何函數(shù)菠劝,即使這個函數(shù)并未實現(xiàn),只要聲明過就不會報錯乙埃。
- 在編譯階段闸英,C語言 調(diào)用 未實現(xiàn)的函數(shù) 就會報錯
2、runtime的作用
- 發(fā)送消息
- 方法調(diào)用的本質(zhì)介袜,就是讓 對象 發(fā)送消息
- objc_msgSend,只有對象才能發(fā)送消息出吹,因此以objc開頭遇伞。
- 使用 消息機制 前提,必須導入#import<objc/message.h>
- 可是在終端中輸入:clang -rewrite-objc main.m 來查看最終生成的代碼
3捶牢、runtime的體驗
//
// ViewController.m
// 000-runtime(消息機制的體現(xiàn))
//
// 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創(chuàng)建一個對象的實現(xiàn)如下
NSObject *objc = [[NSObject alloc] init];
NSLog(@"%@", objc);
}
@end
- 下面來看如何使用runtime來實現(xiàn)同樣一個創(chuàng)建對象的過程
- 首先要導入:#import <objc/message.h>
- 到工程 ->Build Settings搜索msg設置:Enable Strict Checking of objc_msgSend Calls 為 NO鸠珠,這樣在輸入runtime的C語言方法時就會有代碼提示
//
// ViewController.m
// 000-runtime(消息機制的體現(xiàn))
//
// 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創(chuàng)建一個對象的實現(xiàn)如下
//NSObject *objc = [[NSObject alloc] init];
//NSLog(@"%@", objc);
//1、首先要分配一個內(nèi)存空間
/**
* [NSObject alloc]這句代碼在底層調(diào)用的代碼過程
* 第一個參數(shù):調(diào)用方法的 對象
* 第二個參數(shù):對象 調(diào)用那個 方法
*/
id objc = objc_msgSend([NSObject class], @selector(alloc));
// 初始化
objc = objc_msgSend(objc, @selector(init));
NSLog(@"%@", objc);
}
@end
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者