runtime总结

 

Runtime

 

根类, RootClass父类是nil, 有子类以及子类的子类

当我们给定一个实例的时候, 由于 这个实例是id类型的,  objc_object数据结构中里面有个isa成员变量, 所指向的就是这个实例所对应的类对象.同样的, 子类的父类对应的就是对应的类对象, 同样根类也是一样的, 

实例通过isa指针可以找到类对象

最右面一列是根类的元类对象父类的子类的元类对象

对于类对象是objc_class这样的数据结构,但是因为他继承与objc_class, 所以他也有isa指针, 对应的根类的isa指针就指向根类的元类对象

类对象与元类对象的区别和联系

实例对象可以通过isa指针来找到类对象, 类对象中存储方法列表等信息以及类对象可以通过isa指针来找到他的元类对象.从而可以访问一些类方法列表的信息 还要答出原因

我们的类对象和元类对象都是objc_class数据结构的, 这个数据结构由于继承与objc_object类型才有isa指针,进而才能实现实例可以通过isa指针来找到类对象, 进而可以访问方法列表等信息, 类对象可以通过isa指针来找到他的元类对象, 来访问一些类方法列表的信息

元类对象也是objc_class类型的数据结构, 在他们中也有isa指针, 元类的isa指针都指向根元类对象, 包括根元类自身, 也是指向他自己, 根源类对象他的superclass指针指向了根类对象, 比如说我们调用了类方法, 查找的过程逐级父类查找, 元类中找不到就会找到类方法的同名实例方法.

如果我们调用的一个类方法, 没有对应的实现,但是有同名的实例方法的实现,会不会发生crash?产生实际的调用?

由于跟元类对象的superclass指针指向根类对象, 在 元类中查找不到的情况下, 他就会去实例方法中查找, 如果有同名实例方法, 就会调用

消息传递的过程

比如说我们调用了一个实例的方法a, 首先呢, 系统会根据当前实例的isa指针找到他的类对象, 在他的类对象中去遍历方法列表, 去查找同名的方法实现,如果没有找到, 会查找父类的方法列表然后呢查找根类的方法列表, 如果没有查找到,就会走到消息转发流程.

如果调用类方法

就是通过类对象的指针找到元类对象, 然后顺次遍历方法列表,直到根元类对象, 再到根类对象, 再到nil

区别就在元类对象的superclass指针指向根类对象

 

消息传递大致过程

消息传递流程这个问题中

首先要知道缓存是否命中, 当前类方法列表是否命中, 逐级父类方法列表是否命中这三个大点

首先调用一个方法中, 是会先查找缓存, 看看缓存中是否有对应选择器名称的方法实现,如果有的话通过函数指针调用函数, 就完成一次消息传递, 如果没有命中的时候, 会根据当前实例的isa指针, 去查找当前类对象的方法列表, 看看是否有同样名称的方法, 如果找到的话, 那么我们 通过函数指针进行调用, 结束消息传递流程 , 如果没有命中的话, 就需要逐级父类方法中查找, 通过当前对象的superclass指针进行查找父类的方法列表, 如果没有找到就通过父类的superclass一直往上找, 直到nil位置, 如果查找到, 就会根据函数指针, 调用函数实现, 结束消息传递流程, 如果找到根类,  如果没有找到就会进入消息转发流程, 然后结束消息传递的过程

其次针对三个大点具体的内部实现如下

对于缓存查找实际上是哈希查找

对于当前类方法查找, 对于已排序的,采用二分查找, 对于没有排序的, 采用一般遍历查找

对于逐级父类查找, 就是一连一连的遍历每一个父类, 对于每个父类的查找也是整个这个过程

 

结果都是Phone 没有Mobile

[self class]会被转化objc_msgSend函数调用

[super class]会被转化成objc_msgSendSuper函数调用

后者函数调用者虽然是super, 但是super包着的结构体是一个receiver,receiver是当前对象, 所以无论转化成哪个函数接受者都是当前对象

 

 

首先给定的方法选择器, 通过一个函数, 找到对应的bucket_t,从而返回imp指针,  也就是哈希查找

 

消息转发流程

实例方法

对于实例方法的消息转发流程, 系统会回调resolveInstanceMethod: 这个方法, 这个方法有一个参数, 参数是方法的选择器,返回值是bool类型的, 相当于告诉系统要不要解决当前这个实例方法的实现, 他是一个类方法, 不是一个实例方法, 如果返回的是yes, 或者说我们给予方法选择器对应方法的方法实现, 相当于通知系统当前消息已处理, 结束消息转发流程, 如果说resolveInstanceMethod:返回是no, 系统会给予我们第二次机会来处理这个消息,这个时候会回调forwardingTargetForSelector:这个函数,方法的参数是方法的选择器SEL类型,  返回值是一个id, 相当于告诉系统, 这次实例方法的调用应该哪个对象来处理, 转发对象是谁, 如果指定了一个转发目标, 会把这条消息给转发目标, 流程结束.如果第二次处理的时候, 仍然没有返回一个转发目标的情况下, 系统会给我们第三次处理这条消息的机会,也是最后一次机会, 系统会调用methodsignatureforSelector :这个方法, 参数是方法的选择器, 返回值是一个methodsignature这个类, 或者说是一个对象,这个对象实际上是对方法选择器的返回值的类型,以及参数个数和参数类型的封装, 此时如果如果返回了一个方法签名的话, 系统会调用forwardInvocation:, 如果forwardInvocation能处理这个消息的话, 则消息转发流程结束, 如果methodsignatureforSelector:返回的是一个空, 或者是forwardInvocation无法处理这条消息, 被标记会消息无法处理, 常见的crash未识别选择器就是走到消息流程的最后这一步骤 ,产生的一个打印结果.

 

这是一个基于AI视觉识别与3D引擎技术打造的沉浸式交互圣诞装置。 简单来说,它是一棵通过网页浏览器运行的数字智慧圣诞树,你可以用真实的肢体动作来操控它的形态,并将自己的回忆照片融入其中。 1. 核心技术组成 这个作品是由三个尖端技术模块组成的: Three.js 3D引擎:负责渲染整棵圣诞树、动态落雪、五彩挂灯和树顶星。它创建了一个具备光影和深度感的虚拟3D空间。 MediaPipe AI手势识别:调用电脑摄像头,实时识别手部的21个关键点。它能读懂你的手势,如握拳、张开或捏合。 GSAP动画系统:负责处理粒子散开与聚合时的平滑过渡,让成百上千个物体在运动时保持顺滑。 2. 它的主要作用与功能 交互式情感表达: 回忆挂载:你可以上传本地照片,这些照片会像装饰品一样挂在树上,或者像星云一样环绕在树周围。 魔法操控:握拳时粒子迅速聚拢,构成一棵挺拔的圣诞树;张开手掌时,树会瞬间炸裂成星光和雪花,照片随之起舞;捏合手指时视线会拉近,让你特写观察某一张选中的照片。 节日氛围装饰: 在白色背景下,这棵树呈现出一种现代艺术感。600片雪花在3D空间里缓缓飘落,提供视觉深度。树上的彩色粒子和白色星灯会周期性地呼吸闪烁,模拟真实灯串的效果。 3. 如何使用 启动:运行代码后,允许浏览器开启摄像头。 装扮:点击上传照片按钮,选择温馨合照。 互动:对着摄像头挥动手掌可以旋转圣诞树;五指张开让照片和树化作满天星辰;攥紧拳头让它们重新变回挺拔的树。 4. 适用场景 个人纪念:作为一个独特的数字相册,在节日陪伴自己。 浪漫惊喜:录制一段操作手势让照片绽放的视频发给朋友。 技术展示:作为WebGL与AI结合的案例,展示前端开发的潜力。
【顶级EI复现】计及连锁故障传播路径的电力系统 N-k 多阶段双层优化及故障场景筛选模型(Matlab代码实现)内容概要:本文提出了一种计及连锁故障传播路径的电力系统N-k多阶段双层优化及故障场景筛选模型,并提供了基于Matlab的代码实现。该模型旨在应对复杂电力系统中可能发生的N-k故障(即多个元件相继失效),通过构建双层优化框架,上层优化系统运行策略,下层模拟故障传播过程,从而实现对关键故障场景的有效识别与筛选。研究结合多阶段动态特性,充分考虑故障的时序演化与连锁反应机制,提升了电力系统安全性评估的准确性与实用性。此外,模型具备良好的通用性与可扩展性,适用于大规模电网的风险评估与预防控制。; 适合人群:电力系统、能源互联网及相关领域的高校研究生、科研人员以及从事电网安全分析、风险评估的工程技术人员。; 使用场景及目标:①用于电力系统连锁故障建模与风险评估;②支撑N-k故障场景的自动化筛选与关键脆弱环节识别;③为电网规划、调度运行及应急预案制定提供理论依据和技术工具;④服务于高水平学术论文复现与科研项目开发。; 阅读建议:建议读者结合Matlab代码深入理解模型构建细节,重点关注双层优化结构的设计逻辑、故障传播路径的建模方法以及场景削减技术的应用,建议在实际电网数据上进行测试与验证,以提升对模型性能与适用边界的认知。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值