什么是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. EntityFramework 7.0之初探【基于VS 2015】(十)

    前言 本篇作为EF 7.0的开篇也是Entity Framework目前系列末篇,因为关于EF 7.0学习资料实在是太少,我都是参考老外的资料花费了不少时间去研究去尝试同时也失败多次,个人觉得那是值得 ...

  2. Javascript中关键参数this浅析

    自从接触javascript以来,对this参数的理解一直是模棱两可.虽有过深入去理解,但却也总感觉是那种浮于表面,没有完全理清头绪. 但对于this参数,确实会让人产生很多误解.那么this参数到底 ...

  3. C#多任务并行阶段控制—— Threading.Barrier

    有一种场景:4个人同时做某项任务,该任务分为3个阶段,必须要4个人都完成第一阶段后才可以进入第二阶段,都完成第二阶段后才可以进入第三阶段. 此时就需要对多个并行的任务做进度控制. Threading. ...

  4. Objective-C中小怪兽的逻辑

    学习Objective-C的面向对象也有一段时间了,为了犒劳自己的学习成果,写个小怪兽来犒劳一下自己把.在LOL中有怪兽和英雄的角色吧,接下来就先写一个小怪兽的类吧.从小怪兽的角度来讲,怪兽都有那些行 ...

  5. tomcat:there is no resources that can be added or removed from server

    原因: 1.不是web project 解决方式:project-->property--project facet 新建或者修改 2. 版本不兼容 升级tomcat版本

  6. 浅谈 php 采用curl 函数库获取网页 cookie 和 带着cookie去访问 网页的方法!!!!

    由于近段时间帮朋友开发一个能够查询正方教务系统的微信公众平台号.有所收获.这里总结下个人经验. 开讲前,先吐槽一下新浪云服务器,一个程序里的   同一个函数  在PC测试可以正常运行,在它那里就会挂的 ...

  7. js 对cookie 的操作

    <!DOCTYPE html> <html> <head> <script> function setCookie(cname,cvalue,exday ...

  8. supervisor 安装、配置、常用命令

    前言 在 web 应用部署到线上后,需要保证应用一直处于运行状态,在遇到程序异常.报错等情况,导致 web 应用终止时,需要保证程序可以立刻重启,继续提供服务. 所以,就需要一个工具,时刻监控 web ...

  9. 使用代码为textview设置drawableLeft

    xml中的textView中设置android:drawableLeft: <TextView android:id="@+id/bookTitle" android:lay ...

  10. C#基础知识一之base关键字

    前言 其实很早就想写关于C#基础,总是自己给自己找借口,或者去网上搜搜看看,现在想想觉得自己有点懒惰...  作为开发人员,基础知识是重中之重的,只有巩固.理解.实践才能提高自身的技能.同时也希望通过 ...