热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS开发笔记runTime运行时机制简介

1.runTime是一套比较底层的纯C语言的API,属于一个C语言库,包含了很多底层的C语言的API.2.平时编写的OC代码,在程序运行过程中,其实都是转成了runTime的C语言

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


2. 平时编写的 OC 代码, 在程序运行过程中, 其实都是转成了 runTime 的 C 语言代码, runTime 是 OC 的幕后工作者. 


3. 利用 runTime 可以实现一些非常底层的操作(用 OC 不好实现)

1) 在程序运行过程中, 动态创建一个类, 方法: objc_allocateClassPair (比如 KVO 底层实现: 检测 ISA 指针, 发现是新建了一个类, 当然 Xcode7.0以前的版本才可以监听到 ISA 指针)

const char * className = "Calculator";Class kclass = objc_getClass(className);if (!kclass) {Class superClass = [NSObject class]; kclass = objc_allocateClassPair(superClass, className, 0);}

2) 遍历一个类的所有成员变量, 方法, 访问私有变量 (先通过 runTime 的 class_getInstanceVariable 获取成员变量, 再通过 class_getlvar 获取它的值)


3) 在程序运行过程中, 动态为某个类添加属性和方法, 修改属性值和方法. 

使用 class_addIvar 添加一个成员变量

NSUInteger size;NSUInteger alignment;NSGetSizeAndAlignment("*", &size, &alignment);class_addIvar(kclass, "expression", size, alignment, "*");注: 

type 定义参考: 点击打开链接

" * " 星号代表字符(), iOS 字符为4位, 并采用4位对齐 kclass 


使用 class_addMethod 添加成员方法

class_addMethod(kclass, @selector(setExpressionFormula:), (IMP)setExpressionFormula, "v@:@");class_addMethod(kclass, @selector(getExpressionFormula), (IMP)getExpressionFormula, "@@:");static void setExpressionFormula(id self, SEL cmd, id value){NSLog(@"call setExpressionFormula");}static void getExpressionFormula(id self, SEL cmd){NSLog(@"call getExpressionFormula");} 注:

type 定义参考: 点击打开链接

"v@: @", 解释v- 返回值 void 类型, @-self 指针 id 类型, :-SEL 指针 SEL 类型, @-函数第一个参数为 id 类型

"@@: ", 解释@-返回值 id 类型, @-self 指针 id 类型, :-SEL 指针 SEL 类型


给变量赋值

object_setInstanceVariable(instance, "expression", "1+1");


获取变量值

void * value = NULL;object_getInstanceVariable(instance, "expression", &value);

4) 拦截并替换方法, 比如由于某种原因, 要改变一个方法的实现 , 但又不能动它的源码, 这时候 runTime 可以出场了. 

获取方法: class_getInstanceMethod

替换方法: class_replaceMethod


5) 动态方法解析

如果某个对象调用了不存在的方法时会怎样, 一般情况下程序会 crash, 错误信息类似这样: 

unrecognized selector sent to instance 0x7fd0a141afd0在程序 crash 之前, runTime 会给我们动态方法解析的机会, 详情请参考: 
http://blog.csdn.net/qq_34873211/article/details/52184592



推荐阅读
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 本文整理了Java中org.apache.hadoop.hive.ql.plan.ExprNodeColumnDesc.getTypeInfo()方法的一些代码示例,展 ... [详细]
  • QuestionThereareatotalofncoursesyouhavetotake,labeledfrom0ton-1.Somecoursesmayhaveprerequi ... [详细]
  • 对Firefoxios源码的精简Firefox的依赖使用carthage来进行管理,国内的网络是在过于坑爹,相关的依赖包总是无法下载下来,花了两天时间,手动将Firefox所依赖的库导入 ... [详细]
  • imnewtotheswiftandxcodeworld,soimhavingaproblemtryingtointegrateapackagetomypro ... [详细]
author-avatar
turneerpelliccia_291
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有