runloop和runtime小结


  • runloop运行循环

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

  • runtime运行时

    • 是OC面向对象编程语言的运行环境,类似java的虚拟机
    • runtime是OC的底层实现,OC代码最终转换为runtime的C语言库的东西
      • 比如类转换为runtime中的结构体等数据结构
      • 方法转换为C语言中的函数,调用方法都是转成了objc_msgSend() 函数,是消息机制
      • 导入头文件<objc/message.h><objc/runtime.h>
    • runtime可以做的事情:
      • 获取类中的成员变量
      • 为类动态的增加成员变量
      • 动态改变类的方法实现
      • 为类动态的增加新的方法
    • 运行时的运用场景:
      • 1;分类category,动态获取类的属性数组为类动态添加属性

        • 分类中导入objc,class_copyIvar-method-propertyList-protocol,运行时方法获得类属性列表
        • 在分类中写的类方法,+(NSArray *)cz_objProperties{}获得类的属性数组
          • 1;建立分类方法,类方法
          • 2;class_copyPropertyList获取类属性数组
          • 3;遍历数组,
          • 4,property_getName获得数组名字
          • 5;转为OC的字符串NSStringWithCString:加入到数组
          • 6;free(proList)注意释放,retain/creat/copy
      • 2;字典转模型,动态获取类的属性数组,通过KVC设置数值
        • 分类中的+(instance)cz_objectWithDict{}把外面VC的字典转为模型对象

          • 1;获取属性列表
          • 2;遍历字典enumerate...,获得key,value,
          • 3;判断key是否在属性数组中[ proList containsObject:key]
            • 是的话,用KVC赋值,setValue forKey:
          • 4;字典转模型,写到了分类方法里,模型里只有属性,简洁
            • 把分类拖入,所有的对象都具有了这个方法
            • 所有字典转模型框架的写法,会考虑到字典的嵌套
      • 3;给分类,增加关联对象,开发框架时解耦
        • 利用关联对象,提高效率 动态添加属性

          • 1;objc_getAssociatedObject:调用运行时方法前,判断属性数组是否获取,获取就直接返回
          • 2;运行时获取属性数组
          • 3;objc_setAssociatedObject:动态创建属性,记录属性数组
          • 好处是,不用每次都调用运行时方法,提高效率
      • 4;利用运行时交叉方法 method swizzling
        • 1;执行自己的方法
        • 2;然后执行系统或者第三方框架的方法
        • 3;黑魔法,依赖系统/框架的版本,一旦改变就不好了
          • AFN交叉了系统的resume,suspend,af_resume
时间: 2024-10-24 21:49:52

runloop和runtime小结的相关文章

RunTime小结黑魔法

(一)拦截交换系统设置图片的方法 #import <UIKit/UIKit.h> @interface UIImage (MyImage) + (UIImage *)theNewImageName:(NSString *)name; @end #import "UIImage+MyImage.h" #import <objc/runtime.h> @implementation UIImage (MyImage) + (void)load { static di

IOS开发中 RunLoop,RunTime

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

iOS开发RunTime之函数调用

文章来自小笨狼的iOS博客,一直觉得csdn的博客UI不太好看,看博客不太爽,所以自己搭建了一个博客.欢迎各位去链接中看我的博客.也欢迎大家加QQ群讨论iOS技术问题 经过两个多月的面试,工作终于尘埃落定了.这两个多月的面试过程中,我发现很多底层基础的东西大公司非常看重.比如:RunLoop,RunTime,Block等.这篇文章主要是介绍RunTime中函数调用的机制,知识点有一定深度,也是面试过程中能力的体现. 1.Objective-C中的函数调用 对于C语言,函数调用是由编译器直接转化完

iOS开发随笔

突然看到一个搞11年IT的前辈 他的简历给人焕然一新的感觉 IOS:深入理解object-c语言 内存管理(ARC,MRC, 写回传),GCD,RunLoop,RunTime,,Block,Delegate,KVO及实际应用,Foundation框架常用的类:擅长软件架构MVVM+RAC实施:金山SDK播放器;高德地图SDK,熟练使用Autolayout工具及代码Masonry实现不同规格适配:响应式编程框架ReactiveCocoa(RAC)深入理解: 手机系统: Nokia NOS ,IFX

iOS知识点集合

一.前言部分 文中的问题多收集整理自网络,不保证100%准确,还望斟酌采纳. 1.怎样防止指针的越界使用问题? 答案: 1 .防止数组越界,必须让指针指向一个有效的内存地址, 2. 防止向一块内存中拷贝过多的内容 3. 防止使用空指针 4 .防止改变const修改的指针 5. 防止改变指向静态存储区的内容 6. 防止两次释放一个指针 7. 防止使用野指针. 2.http请求方式有哪些? 答案: 1)GET 2)HEAD 3)PUT 4)DELETE 5)POST 6)OPTIONS 3.uivi

iOS开源库源码解析之AsnycDispalyKit

来自Leo的原创博客,转载请著名出处 我的stackoverflow 前言 最近心血来潮,想研究下FaceBook的AsnycDispalyKit的源代码,学习一些界面优化的技术以及编码风格.这篇文章,会详细的记录下我认为对新手有用的部分.后面有空的时候,继续研究其他几个iOS开发很流行的库-AFNetworking,SDWebImage,MBProgressHud,Mantle等`.AsnycDisplayKit是一个非常庞大的库,所以我尽量捞干的讲. 关于AsyncDisplayKit 文档

iOS开发系列之app的一天

本文主要讲述我对 iOS 开发的一些理解,希望能通过 app 从启动到退出,将一些的知识整合起来,形成一条知识链,目前涉及到的知识点有 runloop.runtime.文件存储.界面布局.离线推送.内存管理.响应链.多线程.但大部分较为浅显,我尽量写自己的理解,专业性的代码尽量贴上链接,如有不当欢迎指正. ### 1.点击图标,开始上班,开启主线程,开始跑 runloop, 一个 app,启动之后为什么能一直存活并响应用户的操作,就是因为有一个主线程一直存活,并且主线程开启了一个 runloop

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语言加入了面向对象特性和消息