RunTime&RunLoop初见

什么是runtime

1> runtime是一套底层的c语言API(包括很多强大实用的c语言类型,c语言函数);

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

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

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

举例:

OC :

[[MJPerson alloc] init]

runtime :

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

runtime有啥用?

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

runtime 相关的头文件和函数

1> 头文件

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

2> 相关应用

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

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

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

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

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

3> 相关函数

objc_msgSend : 给对象发送消息

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

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

class_…..

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

4.必备常识

1> Ivar : 成员变量

2> Method : 成员方法

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

什么是RunLoop

RunLoop顾名思义运行循环,可以称它是为了多线程而存在的。

RunLoop的作用1.保持ios程序的持续稳定。2.处理app的各种事件。3.节省CPU资源,提高程序性能,有事情就做事情,没事情就休息

特别说明:

  (1)如果没有Runloop,那么程序一启动就会退出,什么事情都做不了。
  (2)如果有了Runloop,那么相当于在内部有一个死循环,能够保证程序的持续运行
  (3)main函数中的Runloop
   a 在UIApplication函数内部就启动了一个Runloop
     该函数返回一个int类型的值
   b 这个默认启动的Runloop是跟主线程相关联的  
RunLoop对象(1)在iOS开发中有两套api来访问Runloop
      a.foundation框架【NSRunloop】
      b.core foundation框架【CFRunloopRef】
(2)NSRunLoop和CFRunLoopRef都代表着RunLoop对象,它们是等价的,可以互相转换
(3)NSRunLoop是基于CFRunLoopRef的一层OC包装,所以要了解RunLoop内部结构,需要多研究CFRunLoopRef层面的API(Core Foundation层面)RunLoop与线程的关系(1)RunLoop可以让线程不死,且一个runloop对应一个线程。(2)Runloop的创建:主线程Runloop已经创建好了,子线程的runloop需要手动创建(3)Runloop的生命周期:在第一次获取时创建,在线程结束时销毁

Runloop应用
1)NSTimer
2)ImageView显示:控制方法在特定的模式下可用
3)PerformSelector
4)常驻线程:在子线程中开启一个runloop
5)自动释放池
    第一次创建:进入runloop的时候
    最后一次释放:runloop退出的时候
    其它创建和释放:当runloop即将休眠的时候会把之前的自动释放池释放,然后重新创建一个新的释放池
时间: 2024-11-14 13:18:16

RunTime&RunLoop初见的相关文章

关于 IOS Runtime Runloop 2

Runtime 也就是运行时组件,一个纯C语言写的基础库. 我们平时编写的OC代码中, 程序运行过程时, 其实最终都是转成了runtime的C语言代码 Objective-C编写出来的程序必须得到runtime的运行才能正常运行.NSObject的实现(其实就是和runtime做对接, 把自己连入runtime, 这样继承的子类就自动接入runtime了) Runtime能干吗呢? Runtime还允许我们通过标准的接口(C函数)对所有Objective-C类的变量.方法.属性以及协议等等  

Runtime & Runloop

方法->底层会编译成消息->消息查找会使用递归查找 元类是一种虚拟的类,系统实现的,用来存储类对象的 对象分为: 1. 实例对象:存在类里面, 2. 类对象:存在元类里面 实例方法: 递归查找父类 -> 最终会查找到NSObject 如果没有实现就会进入动态方法解析 /*********************************************************************** * lookUpImpOrForward. * The standard IM

iOS 模块分解—「Runtime面试、工作」看我就 🐒 了 ^_^.

引导 相信对于从事开发人员来说 runtime 这个名称都不陌生,就像我起初只知道「 runtime 叫运行时 」,后来知道 runtime 同样可以像 KVC 一样访问私有成员变量,还有「 给类动态添加属性:LNTextField.placeholderColor || 交换方法:imageNamed => ln_imageNamed 」,还有深入的 「 消息机制的调用流程 || 字典转模型 || 实现NSCoding归解档 」以及我们常说的"黑魔法" 是什么? runtime

自定义键盘~新手看

写这日志以及前面的一些简单的东西就是 纯粹的重温一下 记录下自己的点点滴滴  从runtime runloop 到 函数底层 可能是年纪大了 想回顾一下 从入行到现在本人学了java Python PHP Scala C# JS等等一系列的语言  并学以致用 希望以后能有更好的风景~~ 这篇日志很适合新手看 大神勿喷 自定义键盘 应用场景 密码输入 创建 CustomTextField 继承于UITextField KeyBoardView 继承于UIView CustomTextField.h

runtime和runloop的个人理解

RunTime简称运行时.就是系统在运行的时候的一些机制,其中最主要的是消息机制.对于C语言,函数的调用在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 ).编译完成之后直接顺序执行,无任何二义性.OC的函数调用成为消息发送.属于动态调用过程.在编译的时候并不能决定真正调用哪个函数(事实证明,在编译阶段,OC可以调用任何函数,即使这个函数并未实现,只要申明过就不会报错.而C语言在编译阶段就会报错).只有在真正运行的时候才会根据函数的名称找到对应的函数来调用. 没有runloop程序就启

iOS runtime和runloop

runtime 和 runloop 作为一个程序员进阶是必须的,也是非常重要的, 在面试过程中是经常会被问到的, 所以大家有必要进行研究,有能力的童鞋可以和下面作者一样, 亲历实践一下. 在简书里发现了两篇非常好的文章介绍 runtime和runloop的,在这里合二为一了, 把原版作者的东西拿了过来, 为了尊重作者,在这里注明一下 @sam_lau 是runtime的作者, @tripleCC是runloop的作者   RunTime Objective-C是基于C语言加入了面向对象特性和消息

runloop和runtime小结

runloop运行循环 1:是个死循环,主线程默认开启,子线程不开启 2:保证程序不退出 3:监听事件,应用场景 1:定时器,时钟,NSTimer,CADisplayLink 2:监听网络端口数据的接收和发送情况,socket开发 iOS 中所有的事件监听全部由运行循环负责 主线程的 RunLoop 在应用启动的时候就会自动创建 其他线程则需要在该线程下自己启动 不能自己创建 RunLoop RunLoop 并不是线程安全的,所以需要避免在其他线程上调用当前线程的 RunLoop RunLoop

Runtime和Runloop的区别

一.RunLoop: Runloop是事件接收和分发机制的一个实现. Runloop提供了一种异步执行代码的机制,不能并行执行任务. 在主队列中,Main RunLoop直接配合任务的执行,负责处理UI事件.定时器以及其他内核相关事件. (1).RunLoop的主要目的: 保证程序执行的线程不会被系统终止. (2).什么时候使用Runloop ? 当需要和该线程进行交互的时候才会使用Runloop. 每一个线程都有其对应的RunLoop,但是默认非主线程的RunLoop是没有运行的,需要为Run

IOS开发中 RunLoop,RunTime

1.Objective-C中的函数调用 对于C语言,函数调用是由编译器直接转化完成的,在编译时程序就开始查找要执行的函数(C语言函数调用原理).而在OC中,我们将函数调用称为消息发送.在编译时程序不查找要执行的函数,必须等到真正运行时,程序才查找要执行的函数. 例子:在C语言中,仅申明一个函数,不去实现.其他地方调用此函数.编译时就会报错(C语言编译时查找要执行的函数,找不到所以报错).而同样的情况在OC中并不会报错,只有在运行时候才会报错.(OC运行时才查找要执行的函数) 2.Objectiv