什么是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. 前端学PHP之面向对象系列第五篇——对象操作

    × 目录 [1]对象克隆 [2]对象比较[3]对象串行化[4]json 前面的话 本文主要介绍面向对象中的一些对象操作 对象克隆 对象复制,又叫对象克隆,可以通过 clone 关键字来完成 在多数情况 ...

  2. javascript运动系列第五篇——缓冲运动和弹性运动

    × 目录 [1]缓冲运动 [2]弹性运动 [3]距离分析[4]步长分析[5]弹性过界[6]弹性菜单[7]弹性拖拽 前面的话 缓冲运动指的是减速运动,减速到0的时候,元素正好停在目标点.而弹性运动同样是 ...

  3. Hibernate注解

    前言: 最近正在学习Hibernate通过注解(annotation)来管理映射关系,以前都是通过XML映射文件.下面拿个小例子说一下. 数据库物理模型: 数据库的描述: 一篇博客随笔可以分到不同的类 ...

  4. 【CSS进阶】box-shadow 与 filter:drop-shadow 详解及奇技淫巧

    box-shadow 在前端的 CSS 编写工作想必十分常见.但是 box-shadow 除去它的常规用法,其实还存在许多不为人知的奇技淫巧. 喜欢 markdown 版本的可以戳这里. box-sh ...

  5. jsonp跨域+ashx(示例)

    前言 做B/S项目的时候,我们一般使用jquery+ashx来实现异步的一些操作,比如后台获取一些数据到前台,但是如果ashx文件不在本项目下,引用的是别的域下的文件,这时候就访问不了.关于jsonp ...

  6. AspNetPager分页控件配置

    AspNetPager是asp.net中常用的分页控件,下载AspNetPager.dll,添加引用,在工具栏就可以看到AspNetPager控件: 拖过来之后,设置如下属性: <webdiye ...

  7. mysql乐观锁总结和实践--转

    原文地址:http://chenzhou123520.iteye.com/blog/1863407 上一篇文章<MySQL悲观锁总结和实践>谈到了MySQL悲观锁,但是悲观锁并不是适用于任 ...

  8. my SQL下载安装,环境配置,以及密码忘记的解决,以及navicat for mysql下载,安装,测试连接

    一.下载 在百度上搜索"mysql-5.6.24-winx64下载" 二.安装 选择安装路径,我的路径“C:\Soft\mysql-5.6.24-winx64” 三.环境配置 计算 ...

  9. .Net语言 APP开发平台——Smobiler学习日志:如何在手机上实现电子签名功能

    最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的“Smobil ...

  10. JS美女图片切换带视觉差

    使用JS实现,多张图片动态切换查看效果:http://hovertree.com/texiao/js/21/ 效果图: 转自:http://hovertree.com/h/bjaf/iamhxcyk. ...