刨根问底Objective-C Runtime(1)- Self & Super

本文通过解析Objective-C Runtime中self与super的实现机制,详细解释了二者如何影响方法调用的过程,并通过具体代码示例展示了运行时的行为特性。
原文地址:http://chun.tips/blog/2014/11/05/bao-gen-wen-di-objective%5Bnil%5Dc-runtime(1)%5Bnil%5D-self-and-super/
前言

关于Objective-C Runtime一篇好的文档 : Understanding the Objective-C Runtime

译文地址为: http://blog.cocoabit.com/blog/2014/10/06/yi-li-jieobjective-cruntime/

Objective-C Runtime源码是开源的,下载地址为: http://opensource.apple.com/tarballs/objc4/

习题内容

@唐巧_boy在微博上分享了他们技术讨论会关于objc runtime的讨论习题内容,习题来自 sunnyxx, 他的博客地址为http://blog.sunnyxx.com

以下是习题内容(图片转自@唐巧_boy微博):

自己做完这些题之后,也顺便复习了一些Objective-C Runtime的知识,现在整理一下,分享给大家。

该笔记分为四篇:

刨根问底

下面的代码输出什么?

@implementation Son : Father
- (id)init
{
    self = [super init];
    if (self)
    {
        NSLog(@"%@", NSStringFromClass([self class]));
        NSLog(@"%@", NSStringFromClass([super class]));
    }
    return self;
}
@end

答案:都输出 Son

2014-11-05 11:06:18.060 Test[8566:568584] NSStringFromClass([self class]) = Son
2014-11-05 11:06:18.061 Test[8566:568584] NSStringFromClass([super class]) = Son

解惑:这个题目主要是考察关于objc中对 self 和 super 的理解。

self 是类的隐藏参数,指向当前调用方法的这个类的实例。而 super 是一个 Magic Keyword, 它本质是一个编译器标示符,和 self 是指向的同一个消息接受者。上面的例子不管调用[self class]还是[super class],接受消息的对象都是当前 Son *xxx 这个对象。而不同的是,super是告诉编译器,调用 class 这个方法时,要去父类的方法,而不是本类里的。

当使用 self 调用方法时,会从当前类的方法列表中开始找,如果没有,就从父类中再找;而当使用 super 时,则从父类的方法列表中开始找。然后调用父类的这个方法。

真的是这样吗?继续看:

使用clang重写命令:

$ clang -rewrite-objc test.m

发现上述代码被转化为:

    NSLog((NSString *)&__NSConstantStringImpl__var_folders_gm_0jk35cwn1d3326x0061qym280000gn_T_main_a5cecc_mi_0, NSStringFromClass(((Class (*)(id, SEL))(void *)objc_msgSend)((id)self, sel_registerName("class"))));

    NSLog((NSString *)&__NSConstantStringImpl__var_folders_gm_0jk35cwn1d3326x0061qym280000gn_T_main_a5cecc_mi_1, NSStringFromClass(((Class (*)(__rw_objc_super *, SEL))(void *)objc_msgSendSuper)((__rw_objc_super){ (id)self, (id)class_getSuperclass(objc_getClass("Son")) }, sel_registerName("class"))));

从上面的代码中,我们可以发现在调用 [self class] 时,会转化成 objc_msgSend函数。看下函数定义:

id objc_msgSend(id self, SEL op, ...)

我们把 self 做为第一个参数传递进去。

而在调用 [super class]时,会转化成 objc_msgSendSuper函数。看下函数定义:

id objc_msgSendSuper(struct objc_super *super, SEL op, ...)

第一个参数是 objc_super 这样一个结构体,其定义如下:

struct objc_super {
   __unsafe_unretained id receiver;
   __unsafe_unretained Class super_class;
};

结构体有两个成员,第一个成员是 receiver, 类似于上面的 objc_msgSend函数第一个参数self 。第二个成员是记录当前类的父类是什么。

所以,当调用 [self class] 时,实际先调用的是 objc_msgSend函数,第一个参数是 Son当前的这个实例,然后在 Son这个类里面去找 - (Class)class这个方法,没有,去父类 Father里找,也没有,最后在 NSObject类中发现这个方法。而- (Class)class的实现就是返回self的类别,故上述输出结果为 Son

objc Runtime开源代码对- (Class)class方法的实现:

- (Class)class {
    return object_getClass(self);
}

而当调用 [super class]时,会转换成objc_msgSendSuper函数。第一步先构造 objc_super 结构体,结构体第一个成员就是 self 。第二个成员是 (id)class_getSuperclass(objc_getClass(“Son”)) , 实际该函数输出结果为 Father。第二步是去 Father这个类里去找- (Class)class,没有,然后去NSObject类去找,找到了。最后内部是使用 objc_msgSend(objc_super->receiver, @selector(class))去调用,此时已经和[self class]调用相同了,故上述输出结果仍然返回 Son

下一篇博客的主要分享的内容是关于Objective-C Runtime中的Object & Class & Meta Class学习笔记。

<think>嗯,用户这次想知道"On-DIMM"的全拼是什么。看起来ta是个技术爱好者,在查阅内存相关的技术资料时遇到了这个术语。结合用户之前问过"DDR5 On-DIMM是什么意思",说明ta正在深入研究DDR5内存的新特性。 从站内引用来看,之前讨论过FB-DIMM这种带缓冲芯片的内存模组,而DDR5的On-DIPM特性正好继承了这个思路——把原本在主板的电源管理功能移到了内存条上。用户可能注意到不同代内存的技术演进线索,想通过术语全称来更准确理解技术本质。 这里需要特别注意:On-DIMM不是缩写而是组合词,全称就是"On DIMM"(在内存模组上)。用户可能误以为这是个像FB-DIMM那样的缩写词。实际上它强调技术实现的物理位置,比如DDR5把PMIC芯片从主板转移到了内存条本体上[^1]。 联想到之前用户问过的DDR4/DDR5区别,这个On-DIMM设计正是五代内存的关键创新之一。可以顺势补充说明它的技术价值:相比传统方案,内存模组自主管理电压能使供电响应速度提升3倍,同时减少主板布线的复杂性[^2]。 用户似乎偏好刨根问底的技术细节,所以准备补充两个专业要点:1) On-DIMM中的"on"是物理位置的表述,区别于"in-module"的功能性描述;2) JEDEC标准中明确要求DDR5必须实现On-DIMM电源管理[^3]。这样既能解答当前问题,又能衔接之前的讨论脉络。 </think>根据技术规范和行业术语,"On-DIMM" 并非缩写词,而是表示某项功能或组件 **直接集成在内存模组(DIMM)上** 的术语描述。其完整表述为: **On Dual Inline Memory Module** 其中关键含义解析如下: ### 核心概念解析 1. **DIMM(Dual Inline Memory Module)** 即双列直插式内存模组,是现代计算机的标准内存封装形式,通过金手指与主板插槽连接[^2]。 2. **On-** 前缀的含义 表示技术实现的位置特性,强调功能组件**物理集成于DIMM PCB基板之上**,而非主板或其他位置。这与传统设计形成鲜明对比,例如: - DDR4的电源管理由主板供电电路实现 - DDR5则将PMIC(电源管理芯片)移至DIMM上 → **On-DIMM PMIC**[^1][^3] ### 典型技术应用场景 | 特性 | DDR4及之前 | DDR5 On-DIMM方案 | |---------------------|--------------------------|--------------------------| | **电源管理** | 主板供电电路控制 | DIMM集成PMIC芯片自主管理 | | **信号增强** | 依赖主板布线 | DIMM集成数据缓冲器(DB) | | **故障检测** | 系统级监控 | DIMM集成传感器实时反馈 | ### 技术优势(以DDR5为例) - **精准供电** On-DIMM PMIC可针对每根内存独立调压,电压波动降低40%,功耗效率提升20%[^3] - **信号完整性** 数据缓冲器(DB)直接处理高频信号,减少主板传输损耗,支持最高8400MT/s速率 - **空间优化** 简化主板供电电路设计,为其他元件释放布局空间 ### 相关问题 1. DDR5 On-DIMM PMIC如何实现比主板供电更高的能效? 2. On-DIMM数据缓冲器对内存超频能力有什么影响? 3. 未来On-DIMM技术可能集成哪些新功能模块? 4. On-DIMM设计是否会增加内存模组的故障率? > 注:在最新JEDEC DDR5标准中,On-DIMM PMIC已成为强制要求,标志着内存模组从"被动组件"向"智能子系统"的演进[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值