Runtime机制原理分析 RT机制

程序运行时被CPU动态的读取并处理IMP
RunTime框架的API操作的场景补充:

  1. 获取 变量名称

  2. 获取 属性名称

  3. 获取 方法名称

  4. MethodSwizzling Hook SEL 钩挂置换 新IMP执行体

  5. 对象的关联 Category分类结构中新添属性 (伪)变量 存储数据

  6. KVO机制底层原理

  7. 逆向分析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>
  1. 实例 变量名称
    OC中类对象字段名和实例对象字段名实际上是Ivar地址指针 :指向objc_ivar堆结构区层体。
//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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
C#的内存分配机制基于托管堆(managed heap)和垃圾回收(garbage collection)。 1. 托管堆(Managed Heap):在C#中,所有的对象都存储在托管堆中。托管堆是一块被.NET运行时分配的内存区域,用于存储托管对象的实例和数据。托管堆是按照分代(generational)的方式进行管理,将对象分为不同的代,根据对象的生命周期和使用频率来优化垃圾回收效率。 2. 对象创建:当使用`new`关键字创建一个对象时,CLR(Common Language Runtime)会在托管堆上分配一块足够大小的内存来存储对象的数据。CLR会进行必要的初始化工作,如设置对象头信息等。 3. 垃圾回收:C#采用垃圾回收机制来管理内存分配和释放。垃圾回收器会定期扫描托管堆,标记那些仍然被引用的对象,并清除那些没有被引用的对象。垃圾回收器使用了根引用(root references)来确定哪些对象是活动的,其他对象则被认为是可回收的。 4. 引用计数:在某些情况下,C#的垃圾回收器可能会使用引用计数来辅助确定对象是否可以被回收。每当一个对象被引用时,引用计数加1;当一个引用被取消或离开作用域时,引用计数减1。当引用计数为0时,对象可以被回收。 需要注意的是,C#的垃圾回收器并非实时的,而是在需要的时候进行垃圾回收。具体的垃圾回收策略和算法由.NET运行时环境负责管理,而开发人员无需手动进行内存管理。不过,开发人员可以通过使用`IDisposable`接口手动释放一些非托管资源,以提前释放内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HaiJunYa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值