XB_runtime(消息发送)

Android真实系统架构:从Linux内核到Framework的三层绞杀结构 Android并非教科书定义的标准化操作系统,而是一个以Linux内核为基底、经深度裁剪与定制的移动工程生态。其核心原理在于三层紧耦合架构:底层是被阉割又强扩展的Linux内核(含LMK内存管理、wakelock电源机制与Binder IPC);中层是芯片厂商主导的HAL与Vendor Interface,充满私有扩展与兼容性暗坑;上层则是Java Framework与Native Runtime持续博弈的‘拔河现场’。这种架构赋予Android极强硬件适配能力与商业灵活性,但也导致功耗差异、OTA升级复杂 阅读详情

前言:

 前言1.方法的底层结构

struct method_t{
   SEL name; //函数名
   const char *types;//编码(返回值类型、参数类型)
   IMP imp;//指向函数的指针(函数地址)
}
  • SEL代表函数名,一般叫做选择器,底层结构跟char *类似

       

  1. 可以通过@selector() 合sel_registerName()获得
  2. 可以通过sel_getName()和NSStringFromSelector()转成字符串
  3. 不同类中相同名字的方法,所对应的的方法选择器是相同的 
  • IMP代表函数的具体实现 

       

  • types包含了函数的返回值、参数编码的字符串 

     iOS中提供了一个叫做@encode的指令,可以将具体的类型表示成字符串编码

     

关于typedef struct objc_method *Method;它其实等价于struct method_t;

 前言2.方法缓存cachet cache 的底层结构

Class内部结构中有个方法缓存(cache_t),用散列表(哈希表)来缓存曾经调用过的方法,函数名为key,函数地址为value,可以提高方法的查找速度

 

实现:

1.objc_msgSend执行流程01-消息发送

在Class结构体内跟方法相关的有两个底层结构:

1>struct objc_class中的 cachet cache //方法缓存

2>struct class_rw_t中的method_list_t *methods //方法列表

消息查找的顺序是先在receiverClass的cache中查找方法是否存在,不存在的话就在receiverClass方法列表中查找,没有的话就superClass的cache中查找,如果找到了就调用方法并将方法缓存到receiverClass的cache中,如果superClass的cache中没有找到,就在superClass的方法列表中查找,如果找到了就调用方法并将方法缓存到receiverClass的cache中,如果没有就查看上层是否还有superClass。。。

2.objc_msgSend执行流程02-动态方法解析

动态方法解析分为类方法和实例方法两种模式

1>实例方法

- (void)other
{
    NSLog(@"%s---", __func__);
}

+ (BOOL)resolveInstanceMethod:(SEL)sel
{
    if (sel == @selector(test)) {
        // 获取其他方法,这里是self中有other这个方法的实现,如果其他类有某个方法的实现可以改成
        //Method method = class_getInstanceMethod([XXXClass class], @selector(other));
        Method method = class_getInstanceMethod(self, @selector(other));

        // 动态添加test方法的实现
        class_addMethod(self, sel,
                        method_getImplementation(method),
                        method_getTypeEncoding(method));

        // 返回YES代表有动态添加方法
        return YES;
    }


    return [super resolveInstanceMethod:sel];
}


//由于关于typedef struct objc_method *Method;等价于struct method_t,所以可以直接类型转换

+ (BOOL)resolveInstanceMethod:(SEL)sel
{
    if (sel == @selector(test)) {
        // 获取其他方法
        struct method_t *method = (struct method_t *)class_getInstanceMethod(self, @selector(other));

        // 动态添加test方法的实现
        class_addMethod(self, sel, method->imp, method->types);

        // 返回YES代表有动态添加方法
        return YES;
    }
    return [super resolveInstanceMethod:sel];
}
//也可以添加C语言函数来实现
void c_other(id self, SEL _cmd)
{
    NSLog(@"c_other - %@ - %@", self, NSStringFromSelector(_cmd));
}

+ (BOOL)resolveInstanceMethod:(SEL)sel
{
    if (sel == @selector(test)) {
        // 动态添加test方法的实现,v16@0:8可以简化成v@:
        class_addMethod(self, sel, (IMP)c_other, "v16@0:8");

        // 返回YES代表有动态添加方法
        return YES;
    }
    return [super resolveInstanceMethod:sel];
}

 

 2>类方法

void c_other(id self, SEL _cmd)
{
    NSLog(@"c_other - %@ - %@", self, NSStringFromSelector(_cmd));
}
//
+ (BOOL)resolveClassMethod:(SEL)sel
{
    if (sel == @selector(test)) {
        // 第一个参数是object_getClass(self)
        class_addMethod(object_getClass(self), sel, (IMP)c_other, "v16@0:8");
        return YES;
    }
    return [super resolveClassMethod:sel];
}

他们的用法类似,只是class_addMethod的第一个参数,一个是类,一个是元类,个人理解是将消息拦截,然后给receiver动态添加方法的实现。

3.objc_msgSend执行流程03-消息转发

如果没有实现消息解析,就进入消息转发阶段

+ (id)forwardingTargetForSelector:(SEL)aSelector
{
    // objc_msgSend([[Cat alloc] init], @selector(test))
    // [[[Cat alloc] init] test]
    if (aSelector == @selector(test)) return [[Cat alloc] init];

  //如果return的是[Cat class],那么底层就是调用转发目标的类方法
  // objc_msgSend([Cat class], @selector(test))
    // [Cat test]
    return [super forwardingTargetForSelector:aSelector];
}

+ (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
    if (aSelector == @selector(test)) return [NSMethodSignature signatureWithObjCTypes:"v@:"];
    
    return [super methodSignatureForSelector:aSelector];
}

+ (void)forwardInvocation:(NSInvocation *)anInvocation
{
    NSLog(@"1123");
}

@end

生成方法签名还可以利用某个类的方法声明来实现

[[[XXXClass alloc] init] methodSignatureForSelector:aSelector];

至于+ (void)forwardInvocation:(NSInvocation *)anInvocation;

既可以什么都不做,也可以到用invocation指定的目标中找方法的实现。

- (void)forwardInvocation:(NSInvocation *)anInvocation
{
    // 参数顺序:receiver、selector、other arguments
//    int age;
//    [anInvocation getArgument:&age atIndex:2];
//    NSLog(@"%d", age + 10);
    
    
    // anInvocation.target == [[Cat alloc] init]
    // anInvocation.selector == test:
    // anInvocation的参数:15
    // [[[Cat alloc] init] test:15]
    
    [anInvocation invokeWithTarget:[[Cat alloc] init]];
    
    int ret;
    [anInvocation getReturnValue:&ret];
    
    NSLog(@"%d", ret);
}

消息转发阶段会再次执行objc_msgSend的第一步!!!

 

补充:super的本质

super调用,底层会转换成objc_msgSendSuper2函数的调用,接收2个参数

1.>struct objc_super2

2.>SEL

而objc_super2的结构是

struct objc_super2{
   id receiver;
   CLass current_class;
}

reveicer是消息接受者,current_class是receiver的Class对象。这里可以解释[self class]与[super class]的区别。super调用仅仅表明查找方法是从父类开始的而已。

Go重构Droplet控制台:实现字节级终端保真与毫秒响应 终端控制台是远程运维的核心交互界面,其本质是基于TTY的字节流I/O设备,而非普通Web组件。传统方案依赖前端JavaScript解析ANSI序列、WebSocket中转及DOM渲染,导致高延迟与状态失真;而Go语言凭借原生协程调度、零拷贝内存管理、系统调用直通能力(如openpty/ioctl)以及golang.org/x/term等底层包,实现了从连接建立、键盘输入传输到服务端字符网格计算的全链路优化。这种架构显著提升终端保真度(Terminal Fidelity),保障Ctrl+C、SIGWINCH、 阅读详情

相关推荐

Python_构建同花顺问财智能选股API服务

本文详细介绍了如何使用Python构建同花顺问财智能选股API服务,涵盖从环境准备、核心API开发到高级功能扩展的全过程。通过Flask框架和pywencai库,开发者可以快速搭建稳定可靠的选股接口,实现自动化股票筛选与交易系统集成,提升量化投资效率。

weixin_30596343的博客 333

ROS消息序列化原理与工程实践:从.msg到字节流的全链路解析

在机器人系统开发中,消息序列化是实现节点间可靠通信的基础技术,它决定了数据如何从C++内存结构安全、高效地转化为网络可传输的字节流。其核心涉及IDL接口定义、POD内存布局约束、大小端适配、零拷贝共享内存支持等底层机制。相比通用序列化方案(如JSON/Protobuf),ROS自研序列化器以确定性延迟、ABI稳定性与硬件亲和性为设计目标,特别适用于实时控制、嵌入式部署及跨平台异构系统。本文深入拆解rosidl生成链路、QoS对序列化行为的影响、std::vector/string等非POD类型的适配原理,并

weixin_30613343的博客 316

2.4G板载PCB IFA天线仿真设计

本文简单介绍下2.4GHz的板载PCB IFA天线的HFSS仿真与设计。

射频问问 (RFASK.NET) 是在"微波射频网(MWRF.NET)”系列原创技术专栏基础上升级打造的技术问答学习平台。 6012

XB_runtime(应用)

例子: 1.可以获取成员变量信息,也可以设置和获取成员变量的值 可以用来对模型赋值json解析的数据,也可以通过KVC对未公开的成员变量进行修改 self.textField.placeholder = @"请输入用户名"; [self.textField setValue:[UIColor redColor] forKeyPath:@"_...

HuberCui的博客 395

用Matlab搞定Delta并联机器人运动学:从建模到正逆解完整流程(附代码)

本文详细介绍了如何使用Matlab实现Delta并联机器人的运动学分析,包括几何建模、正逆解求解及可视化验证。通过符号计算和数值迭代法,解决非线性方程组问题,并提供完整代码示例,帮助读者快速掌握Delta机器人的运动学计算与应用。

weixin_30955617的博客 177

python爬虫自动下载网页链接

需求分析 今天遇到一个简单的需求,需要下载澳大利亚电力市场NEM日前市场的发电商报价数据(http://nemweb.com.au/Reports/Current/Next_Day_Offer_Energy/),页面观感是这样的: Ctrl + F 一下,看到一共有395个zip链接。于是就想着用python爬虫自动下载。这个网页很简单,没有验证码,甚至不需要登录,因此自动下载的pytho...

da_kao_la的博客 1万+

动态链接与静态链接

静态库 Linux下的静态库通常以.a为后缀,用于创建.a的工具为ar(archive的缩写).静态库链接后会将所有数据会添加到调用程序, 因此使用静态库的程序体积可能较大,但是使用静态库的程序不需要外部依赖项. 举例 以hello.cpp、hello.h为例 生成目标文件 g++ -c hell.c -o hello.o 生成静态库 ar -crv libhello.a hel...

xbwueric3的博客 319

BEV感知技术全景解析:从纯视觉到多传感器融合的实战指南

本文全面解析了自动驾驶中的BEV感知技术,从纯视觉到多传感器融合的实战应用。文章深入探讨了BEV如何提供“上帝视角”,对比了IPM、Lift-Splat-Shoot及Transformer等核心实现范式,并详细阐述了多传感器融合(尤其是中融合)的工程实践与优势,为开发者提供了从理论到原型搭建的完整指南。

win55的博客 1141

读源码笔记--文件过滤驱动FileSpy第4篇 -- 关于IRP_MJ_FILE_SYSTEM_CONTROL

前面3篇,已经读完了绑定一个文件系统被挂载时,绑定的操作。这里得说一下总体的框架视角下,需要绑定的东西。   1:变动回调里实现绑定,这个绑定是文件系统被挂载或取消时,需要实现的。 2:变动回调已经掉过了,就是说文件过滤驱动已经加载,并运行。新来某个文件系统的储存设备,也需要绑定。   这里变动回调里面已经绑定了已经存在的卷设备,那么新加上来的存储设备,如何绑定?看下

junjie1595的专栏 2338

100天精通Python(基础篇)——第2天:基础语法详解(标识符、保留字、注释与代码结构)

100天精通Python(基础篇)——第2天:基础语法详解(标识符、保留字、注释与代码结构)

努力让自己发光,对的人才能迎着光而来 34万+

基于深度学习的电力系统暂态稳定评估与预防控制复现

本文复现了基于深度学习的电力系统暂态稳定评估与预防控制方法。主要内容包括:(1)数据预处理环节,对IEEE 39节点系统的电压幅值、相角等特征数据进行归一化处理;(2)ACNGAT模型实现,该模型结合时间卷积网络(TCN)和图注意力网络(GAT)提取时空特征;(3)采用改进的帝企鹅优化算法进行预防控制。关键技术点包括:融合时空信息的特征提取、改进的邻接矩阵构建方法(λ_ij = E_i * E_j * B_ij)以及时空注意力机制。代码实现采用Python和PyTorch框架。

huanghm88的专栏 336

[内核驱动] VS2012+WDK 8.0 Minifilter实现指定扩展名文件拒绝访问

转载:http://blog.youkuaiyun.com/C0ldstudy/article/details/51585708 转载:http://blog.youkuaiyun.com/zj510/article/details/39344889 转载:http://blog.youkuaiyun.com/zj510/article/details/39345479 转载:http://www.cnblogs.com/js...

weixin_34221773的博客 437

Android 13 Settings蓝牙列表卡顿问题排查及优化过程

此时我们的卡顿优化基本完成了,我们应该要考虑内存是否会泄漏,如果大家不知道哪些需要回收可以用leakcanary和android profiler进行内存检测,看代码有没有内存泄漏。

龚礼鹏的博客 2547

IRP操作文件填坑日记

背景: 近段时间一个项目需要IRP操作文件.于是.搜索硬盘.把好几年前的代码找出来.说起这个代码,需要感谢黑月教主(achillis)和炉子.当时炉子开源了PsVoid. 里面就有Irp操作文件.但是抄了之后.win7蓝屏.当时水平太菜.只好在Q上麻烦教主帮忙.教主帮忙分析一番之后.于是网上就有了.那个经典的ULONG UnKnow[41]. 然后各个博客转载…当然了.当时我自己也先存了一份.不过...

zz_strive_2012的专栏 595

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

add ipc syscall for android x86,Android - strace runtime

Last time I looked at the processes involved with initialising the Android Java framework. This wasn't able to give us much information on what was happening. To get some more data we are going to be ...

weixin_42462474的博客 246

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Check failed: Thread::Current() != GetDebugThread() (Thread::Current()=0xaa98e400, GetDebugThread()=

断点调式的时候遇到如下问题,程序崩溃,亲测下图方法可以04-08 20:42:42.560 21405-21412/com.littlegold.littlegoldweather A/art: art/runtime/runtime.cc:422] Runtime aborting...04-08 20:42:42.560 21405-21412/com.littlegold.littlegol...

u013023845的博客 1331

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Android Kotlin版封装EventBus

Android Kotlin版封装EventBus

xiangxiongfly 1231

企业微信会话存档sdk报错:A fatal error has been detected by the Java Runtime Environment

注意我这里加了一个标记sdkDestroyed,一旦捕获到了WxErrorException,getMediaFile这个方法其实已经销毁了sdk,就不要重复销毁,否则还是会有这个问题。知道问题的原因,就好解决了。首先你得好好review一下你的代码,到底哪里重复销毁了相同的sdk,或者前面销毁了sdk,后面又尝试去用。所以我的处理流程是,先拉取消息,然后使用拉取消息的sdk拉取媒体文件,然后就遇到了本文说的这个问题。我们不卖关子,问题的原因就是,你使用了已经被销毁的sdk,或者重复销毁一个sdk。

代码君 1594

手撕ARM64启动栈(八):QEMU + TF-A(ATF) OP-TEE 初始化详解

bl1_main()手撕ARM64启动栈(八):QEMU + TF-A(ATF) OP-TEE 初始化详解。

Fifty的博客 335

Arm Neoverse CSS V3 RSE安全架构与加固实践

硬件安全架构是现代嵌入式系统防御复杂攻击的核心基础,Arm Neoverse CSS V3中的Runtime Security Engine(RSE)通过物理层、逻辑层和协议层的三维防护机制实现芯片级安全。其Security Alarm Manager(SAM)模块构建了层级化监控体系,而Message Handling Unit(MHU)则采用AES-CMAC等加密算法确保通信安全。在汽车电子和工业控制等场景中,RSE可作为可信执行环境(TEE)的安全协处理器,独立管理密钥材料并验证固件完整性。实践表明,

weixin_33730836的博客 439

HG-ha/MTools部署详解:Linux服务器端服务启动方法

本文介绍了如何在星图GPU平台上自动化部署HG-ha/MTools 开箱即用镜像,无需手动配置依赖即可在Linux服务器端启用AI工具链。该镜像支持批量图像处理、音视频转码及AI模型推理,典型应用于社交媒体图片去水印与多尺寸海报自动生成,显著提升内容生产效率。

weixin_29317963的博客 370

Linux 驱动研究 —— I2C (3)

本文深入解析 Linux 内核 I2C 子系统的标准化核心通信接口 i2c_transfer 及其核心数据结构 struct i2c_msg,重点探讨其 flags 变量在 首先梳理了 i.MX 平台物理层 I2C 读写及 DMA 传输的硬件状态机执行流程,透视了 CPU 与 DMA 在首尾字节控制权交接上的物理约束。

kdxiaojie的博客 538

WPF的画图请求是如何生成和派发

WPF通过System.Windows.Media.Composition.DUCE相关函数跟worker thread通信,具体来说是通过kernel object来实现的。仔细研究了DUCE内相关函数后,发现这个东西相当有货,从暴露出来的函数名字,就可以猜测到UI thread和render thread的交互模型。应该是UI thread准备好足够的数据后,然后发送请求通知Rend...

weixin_30767835的博客 189

让训练告别“黑盒“:mmsegmentation 语义分割可视化全流程实战

很多人第一次跑语义分割训练,都是这么过来的:点开训练脚本,屏幕上滚过一屏又一屏的 loss 和 mIoU 数字,看久了只觉得它们像密码一样,却说不出模型到底学到了什么。等几十个小时过去,指标总算涨了,可你根本不知道中间有没有错过最好的 checkpoint,也不知道哪些类别一直被模型当空气。这种"闭眼开车"式的调参,正是我想帮你解决的第一个问题。 好消息是,OpenMMLab 出品的 **mms

gitblog_00084的博客 669

Android 稳定性【篇二:ANR&SWT】

ANR(Application Not Responding,即应用程序无响应)。在Android中,当应用程序在规定时间内没有处理完毕相应的事件,系统就会报出ANR。

qq_27672101的博客 6432

机器视觉---熔池相机(穿透强光的视觉感知)

熔池相机技术原理与应用摘要 熔池相机是焊接机器人的核心视觉传感器,通过多光谱滤波(800-1100nm近红外)、高动态成像(120dB+)和主动光源补偿三大技术突破强弧光干扰,实现熔池清晰成像。其工业级硬件设计包含窄带滤光系统、水冷/气冷防护结构和实时处理单元(FPGA+ARM),支持GigE Vision/USB3.0接口。相机按功能分为监控型、跟踪型、缺陷检测型和立体视觉型,关键技术参数包括分辨率(1920×1080)、帧率(≥240fps)和同步能力。图像处理采用U-Net深度学习与传统算法融合,实现

MzKyle的博客 1622
上一篇: Class中的isa指针本质
下一篇: XB_runtime(应用)
史蒂芬-周
博客等级 码龄9年 5粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值