什么是runtime

runtime就是一套底层的c语言API(Application Programming Interface)里面包括很多强大实用的c语言类型、c语言函数。

实际上,平时我们编写的oc代码,底层都是基于runtime实现的。

也就是说我们平时编写的oc代码最终都是转成了底层的runtime代码(c语言代码) 。

[obj say] —> 调用id objc_msgSend(id self, SEL op, ...)函数 -> 里面的obj.isa指针-> class -> class.cache_List -> class.Method_List -> superClass

例如 [obj say]; 像这样对象执行一个方法的时候转成了runtime库里面的C语言函数即 objc_msgSend(objc, @selector(say))

内部对象寻找到方法并执行的具体步骤:

MRC开发环境下
1.先检查 @selector 方法是否可以省略
2.检查 target(目标对象objc) 是否为 nil,如果为 nil 就 clearout 并直接 return
3.找到 target 对应的class,然后根据 @selector 找到IMP(函数指针)
4.先从当前class的一个方法名叫cache_List缓存列表去找,找到就跳到对应的IMP实现方法,如果没找到,就去method_List方法列表找
5.如果再没找到就去父类的super_List找,一直找到基类(NSObject)为止,如果还找不到就进入动态解析和消息转发机制

duang~daung~daung  runtime的核心来了就是动态解析

讲到这里我们知道内部是这样走的那么是不是可以拦截所有的系统方法为我们自己所用,同样我们要想精通一个类就可以解开他每一个实例变量和方法

runtime有啥用?

当遇到 不使用继承的方法给系统类添加一个外界可以访问的公共属性 使用runtime就可以完美解决

1>能动态生成一个类,一个成员变量,一个方法
2>能动态修改一个类,一个成员变量,一个方法
3>能动态删除一个类,一个成员变量,一个方法

常见的函数,头文件

#import<objc/runtime.h> : //成员变量,类,方法
class_copyIvarList : 获得某个类内部的所有成员变量
class_copyMethodList : 获得某个类内部的所有方法
class_getInstanceMethod : 获得某个具体的实例方法 (对象方法,减号-开头)
class_getClassMethod : 获得某个具体的类方法 (加号+开头)
method_exchangeImplementations : 交换两个方法的实现
-----------------------------------------------------------
#import<objc/message.h> : //消息机制
objc_msgSend(...)

1》runtime实现的机制是什么,怎么用,一般用于干嘛?


这个问题我就不跟大家绕弯子了,直接告诉大家,


runtime是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语言API。


在我们平时编写的OC代码中, 程序运行过程时, 其实最终都是转成了runtime的C语言代码, runtime算是OC的幕后工作者


比如说,下面一个创建对象的方法中,


举例:


OC :


[[MJPerson alloc] init]


runtime :


objc_msgSend(objc_msgSend(“MJPerson” , “alloc”), “init”)


第二个问题


runtime 用来干什么呢??用在那些地方呢?怎么用呢?


runtime是属于OC的底层, 可以进行一些非常底层的操作(用OC是无法现实的, 不好实现)


在程序运行过程中, 动态创建一个类(比如KVO的底层实现)


在程序运行过程中, 动态地为某个类添加属性\方法, 修改属性值\方法


遍历一个类的所有成员变量(属性)\所有方法


例如:我们需要对一个类的属性进行归档解档的时候属性特别的多,这时候,我们就会写很多对应的代码,但是如果使用了runtime就可以动态设置!


例如,PYPerson.h的文件如下所示


import


@interfacePYPerson : NSObject


@property (nonatomic, assign) int age;


@property (nonatomic, assign) int height;


@property (nonatomic, copy) NSString *name;


@property (nonatomic, assign) int age2;


@property (nonatomic, assign) int height2;


@property (nonatomic, assign) int age3;


@property (nonatomic, assign) int height3;


@property (nonatomic, assign) int age4;


@property (nonatomic, assign) int height4;


@end


而PYPerson.m实现文件的内容如下


#import "PYPerson.h"


import


@implementation PYPerson


(void)encodeWithCoder:(NSCoder)encoder


{


unsigned int count = 0;


Ivarivars = class_copyIvarList([PYPerson class], &count);


for (int i = 0; i


// 取出i位置对应的成员变量Ivar ivar = ivars[i];// 查看成员变量constchar*name = ivar_getName(ivar);// 归档NSString*key = [NSStringstringWithUTF8String:name];idvalue = [selfvalueForKey:key];[encoder encodeObject:value forKey:key];


}


free(ivars);


}


(id)initWithCoder:(NSCoder *)decoder


{


if (self = [super init]) {


unsignedintcount =0;Ivar *ivars = class_copyIvarList([PYPerson class], &count);for(inti =0; i


}


return self;


}


@end


这样我们可以看到归档和解档的案例其实是runtime写下的


学习,runtime机制首先要了解下面几个问题


1相关的头文件和函数


1> 头文件


利用头文件,我们可以查看到runtime中的各个方法!


2> 相关应用


NSCoding(归档和解档, 利用runtime遍历模型对象的所有属性)


字典 –> 模型 (利用runtime遍历模型对象的所有属性, 根据属性名从字典中取出对应的值, 设置到模型的属性上)


KVO(利用runtime动态产生一个类)


用于封装框架(想怎么改就怎么改)


这就是我们runtime机制的只要运用方向


3> 相关函数


objc_msgSend : 给对象发送消息


class_copyMethodList : 遍历某个类所有的方法


class_copyIvarList : 遍历某个类所有的成员变量


class_…..


这是我们学习runtime必须知道的函数!


4.必备常识


1> Ivar : 成员变量


2> Method : 成员方法


从上面例子中我们看到我们定义的成员变量,如果要是动态创建方法,可以使用Method

OC的runtime运行机制的更多相关文章

  1. oc - runtime运行机制

      Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时做的事放到了运行时来处理.同时OC也是一门简单的语言,很大一部分是C的内容,只是在语言层面上加了关键字和语法,真正让OC强大 ...

  2. IOS runtime运行机制详解(一)

    OC运行机制是指,可以运行的时候动态调用函数.因为C语言必须在编译的时候就决定调用哪个函数. 我们平时写的OC代码,它在运行的时候也是转换成了runtime的方式运行的.任何方法调用本质:就是发送一个 ...

  3. runtime运行机制方法学习

    runtime这玩意第一次听说时都不知道是什么,经过了解后才知道它就是oc动态语言的机制,没有它那oc就不能称为动态语言.在之前可能大家对runtime了解都不深,随着编程技能的日益加深和需要,大家开 ...

  4. runtime 运行机制2

    Mike_zh QQ:82643885 end: blogTitle 博客的标题和副标题 博客园 首页 新随笔 联系 订阅 <a id="MyLinks1_XMLLink" ...

  5. runtime 运行机制

    // //  HKPerson.h //  runtimeDemo1 // //  Created by 123 on 16/5/23. //  Copyright © 2016年 123. All ...

  6. iOS开发——高级技术OC篇&运行时(Runtime)机制

    运行时(Runtime)机制 本文将会以笔者个人的小小研究为例总结一下关于iOS开发中运行时的使用和常用方法的介绍,关于跟多运行时相关技术请查看笔者之前写的运行时高级用法及相关语法或者查看响应官方文档 ...

  7. runtime 运行时机制 完全解读

    runtime 运行时机制 完全解读   目录[-] import import 我们前面已经讲过一篇runtime 原理,现在这篇文章主要介绍的是runtime是什么以及怎么用!希望对读者有所帮助! ...

  8. Runtime运行时机制

    Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的 我们需要了解的是 Objective-C 是一门动态语言, ...

  9. OC中Runtime浅析

    近期了解了一下OC的Runtime,真的是OC中非常强大的一个机制,看起来比較底层,但事实上能够有非常多活用的方式. 什么是Runtime 我们尽管是用Objective-C写的代码,事实上在运行过程 ...

随机推荐

  1. 《ASP.NET Web API 2框架揭秘》样章(PDF版本)

    <ASP.NET Web API 2框架揭秘>(详情请见<新作<ASP.NET Web API 2框架揭秘>正式出版>)以实例演示的方式介绍了很多与ASP.NET ...

  2. Java (JVM) Memory Model – Memory Management in Java

    原文地址:http://www.journaldev.com/2856/java-jvm-memory-model-memory-management-in-java Understanding JV ...

  3. matlab基础教程——根据Andrew Ng的machine learning整理

    matlab基础教程--根据Andrew Ng的machine learning整理 基本运算 算数运算 逻辑运算 格式化输出 小数位全局修改 向量和矩阵运算 矩阵操作 申明一个矩阵或向量 快速建立一 ...

  4. Oracle配置和使用闪回

    环境:RHEL 6.4 + Oracle 11.2.0.4 目录: 一.闪回查询 1.1 闪回查询举例 1.2 闪回版本查询举例 二.闪回事物 2.1 闪回事物查询的先决条件 2.2 闪回事物查询 三 ...

  5. 1Z0-053 争议题目解析707

    1Z0-053 争议题目解析707 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 707.Because of a logical corruption in the EMPLOY ...

  6. hibernate笔记--基于外键的单(双)向的一对一映射关系

    假设我们有两张表,人员信息表Person,和身份信息表IdCard,我们知道每个人只有一个身份证号,所以这里的Person和IdCard表是一一对应的,也就是一对一的映射关系,基于外键的单向一对一映射 ...

  7. chrome扩展程序开发

    首先,明确两个概念的区别:chrome扩展程序和Web Apps.具体参考:http://www.chromi.org/archives/10106 本文只讨论chrome扩展程序. 最好的开发教程莫 ...

  8. Winform在线更新

    引言 2015年第一篇,Winform在线更新,算是重操旧业吧,09年刚到北京时一直做硬件联动编程,所以大多数时间都在搞Winform, 但是从来没做过在线更新这个功能,前几天参与部门另一个项目,上来 ...

  9. 和JavaScript家的闭包玩玩捉迷藏

    JavaScript的闭包 首先声明,这是一篇面向小白的博客,不过也欢迎各位大牛批评指正,谢谢.   其实关于闭包各个论坛社区里都有很多的文章来讲它,毕竟闭包是JavaScript中一个特色,也正因为 ...

  10. WCF 数据数据 DataTable

    一般在WCf数据大数据是 List集合 或者 Json. public DataTable GetProperitybyModelCode(string modelCode) { using (var ...