赞
踩
程序运行时被CPU动态的读取并处理IMP
RunTime框架的API操作的场景补充:
获取 变量名称
获取 属性名称
获取 方法名称
MethodSwizzling Hook SEL 钩挂置换 新IMP执行体
对象的关联 Category分类结构中新添属性 (伪)变量 存储数据
KVO机制底层原理
逆向分析Mach-o文件
C函数的调用方式/OC事件的调用方式
The Objective-C language defers as many decisions as it can from compile time and link time to runtime. Whenever possible, it does things dynamically. This means that the language requires not just a compiler, but also a runtime system to execute the compiled code. The runtime system acts as a kind of operating system for the Objective-C language; it’s what makes the language work.
RT机制把内存的暂时性消耗从编译链接阶段/安装部署阶段推迟到正式运行阶段(正式运行(点符执行链(属性名所勾连的事件实例)被CPU读取并处理)后才会暂时性消耗对应内存)。利用RT机制可篡改程序在运行阶段供CPU读取并处理的事件(MethodSwizzling)。RT机制下公开了对象的runtime框架(补充API操作供特殊场景)。
备注:具体数据内容实例 内存占用消耗
抽象元类/元地址 存储于缓存元部件内
RT机制 涉及底层 对象 支撑runtime框架
RT机制 表明 在编译链接阶段只存储于缓存元部件内(元地址) 尚未进行内存的开辟(占用消耗)(尚无CPU产生的内容数据)/只在运行即对应API(元地址)处于被CPU动态引用并产生内容数据时开辟内存(占用消耗)/若对应API(元地址)尚未处于被CPU动态引用则也尚未开辟对应的内存(可减少内存的无效占用消耗)/RT运作机制 保证了 内存的动态化高效化
抽象的逻辑概念 元地址指向API事件本身实例
属性名 勾连 间接写读事件本身实例
内存元件位处CPU外
CPU处理器元件
内存元件DRAM技术
缓存元件位处CPU内 速度快
部署环境 本质 对应着 缓存元部件区
部署环境的过程:拆解软件产品ipa包 文件资源(声明文件/执行文件)放置到缓存元部件里(声明文件CPU默认解析(属性))
运行过程:状态切换进入到运行模式,CPU快速的从缓存元部件中读取相关的执行文件对应执行区内的点符执行链产生逻辑内容数据(暂时性存放在内存部件中/进行内存开辟占用/内存消耗)
编译链接阶段:形成软件产品ipa包
编译链接阶段 安装部署阶段 运行阶段
编译链接阶段和安装部署阶段完成:交互环境已布置好即文件资源已放置到缓存元部件里(此时尚未正式执行/尚无CPU处理的内容数据/尚未暂时性开辟内存消耗)
应用程序的稳定性 决定于 内存的占用消耗
msgsend() C函数
编译链接阶段 安装部署阶段
运行阶段
编译链接阶段:程序本身已有的资源通过语法检测转为可识别资源包即可(编译链接阶段内IMP(事例)执行体可有可无不检测)
运行阶段:CPU读取并 开始 关注查找IMP执行体
处理器通过执行msgSend()C函数获取到与目标对象相关的通知消息并根据通知消息调用目标对象的事件实例(Selector)。
引入C语言API函数底层增量包(ObjectiveC基于C封装(操作OC自己特有的新增语法/可以直接使用C语法))
特殊场景的补充API操作需引入纯C语言runtime框架(纯C语言公开型函数文件)
#import <objc/runtime.h>
//An opaque type that represents an instance variable.
//struct objc_ivar
typedef struct objc_ivar *Ivar;
通过Runtime环境下纯C语言函数class_copyIvarList可获取Ivar指针列表(元素Ivar地址指针指向类和实例对象)。
- (void)runTimeAnalysis { u_int count = 0; // //C语法风格 // struct objc_ivar * *ivars = class_copyIvarList([UIView class], &count); //unsigned int * _Nullable outCount:函形参outCount接收unsignedint内容区的地址(指针函形参outCount可以持有unsignedint内容区的地址(指针形参outCount对应的底层指令可以实现对相应内存区域的访问修改写入新数据值)) //class_copyIvarList函数获取的列表中元素的数目通过底层的指针访问指令写入count对应的空间内(count对应区域内存放有元素的数目数据) //C语言体系C语法定义声明ivars数组 Ivar* ivars = class_copyIvarList([UIView class], &count); for (int i = 0; i<count; i++) { //C语言ivar_getName函数事件:获取ivar地址指针对应的实例变量名 const char *ivarName = ivar_getName(ivars[i]); NSString *ivarNameNS = [NSString stringWithCString:ivarName encoding:NSUTF8StringEncoding]; NSLog(@"ivarNameNS=%@",ivarNameNS); } }
包含UIView中常用的实例变量化风格名,对于属性如layer/tag等自动生成_前缀的成员变量(名)。属性中变量化风格名部分_前缀。
属性名称
OC中类和对象的属性(强调属性风格特性), 是objc_pr
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。