iOS经典讲解之[self class]和[super class]的区别

iOS网址处理实战:从主屏快捷方式到WKWebView拦截与重写 在iOS开发与日常使用中,网址远不止是一串字符,它既是网页入口,也是原生与H5协作的通道。理解URL的基础组成与Scheme机制,是掌握iOS网址处理的第一步。通过WKWebView的导航代理,开发者可以灵活拦截请求,实现域名重写、自定义Scheme唤起App等操作;而普通用户也能借助Safari“添加到主屏幕”或Web Clip描述文件,将常用网址高效部署为桌面入口。本文围绕iOS网址改位这一核心主题,覆盖URL重定向原理、ATS安全配置、本地Vue打包项目加载及离线包优化等实践,帮助读者系统解决网页打不 阅读详情

作者:Loving_iOS

转载请标明出处:http://blog.youkuaiyun.com/loving_ios/article/details/49884599

在objc中的类实现中经常看到这两个关键字”self”和”super”,但他们的区别表现在各个方面。
以下面的代码为例:

@interface Father:NSObject 
{
NSString*  name;
}
- (void)setName:(NSString*) yourName;

@end

@interface Son:Father
{
NSUInteger age;
}
- (void) setAge:(NSUInteger) age;
- (void) setName:(NSString*) yourName andAge:(NSUInteger) age;
@end
@implementation Son
- (void) setName:(NSString*) yourName andAge:(NSUInteger) age 
{
[self setAge:age];
[super setName:yourName];
}
@end
int main(int argc, char* argv[]) {
AutoreleasePool{
Son* son = [[Son alloc] init];
[son setName:@"aaa" andAge:18];

}
return 0;
}
 

上面有简单的两个类,在子类Son中调用了自己类中的setAge和父类中的setName,这些代码看起来很好理解,没什么问题。 然后我在setName:andAge的方法中加入两行:

NSLog(@"self ' class is %@", [self class]);
NSLog(@"super' class is %@", [super class]);

这样在调用时,会打出来这两个的class,先猜下吧,会打印出什么? 按照以前oop语言的经验,这里应该会输出: self ' s class is Son super ' s class is Father

但是编译运行后,可以发现结果是:

self 's class is Son

super ' s class is Son

self的class和预想的一样,怎么super的class也是Son?

具体原因要看他们的内部实现机制是什么样的:

self 是类的隐藏的参数,指向当前当前调用方法的类,另一个隐藏参数是_cmd,代表当前类方法的selector。这里只关注这个self。super是个 啥?super并不是隐藏的参数,它只是一个“编译器指示符”,它和self指向的是相同的消息接收者,拿上面的代码为例,不论是用[self setName]还是[super setName],接收“setName”这个消息的接收者都是son这个对象。不同的是,super告诉编译器,当调用setName的方法时,要去调用父类的方法,而不是本类里的,super只是指示符的作用没有实际意义。

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

这种机制到底底层是如何实现的?其实当调用类方法的时候,编译器会将方法调用转成一个C函数方法调用,apple的objcRuntimeRef上说:

 Sending Messages
When it encounters a method invocation, the compiler might generate a call to any of several functions to perform the actual message dispatch, depending on the receiver, the return value, and the arguments. You can use these functions to dynamically invoke methods from your own plain C code, or to use argument forms not permitted by NSObject’s perform… methods. These functions are declared in /usr/include/objc/objc-runtime.h.
■   objc_msgSend sends a message with a simple return value to an instance of a class.
■   objc_msgSend_stret sends a message with a data-structure return value to an instance of
a class.
■   objc_msgSendSuper sends a message with a simple return value to the superclass of an instance of a class.
■   objc_msgSendSuper_stret sends a message with a data-structure return value to the superclass of an instance of a class.

可以看到会转成调用上面4个方法中的一个,由于_stret系列的和没有_stret的那两个类似,先只关注objc_msgSend和objc_msgSendSuper两个方法。

当使用[self setName]调用时,会使用objc_msgSend的函数,先看下objc_msgSend的函数定义:

 id objc_msgSend(id theReceiver, SEL theSelector, ...)

第一个参数是消息接收者,第二个参数是调用的具体类方法的selector,后面是selector方法的可变参数。我们先不管这个可变参数,以 [self setName:]为例,编译器会替换成调用objc_msgSend的函数调用,其中theReceiver是self,theSelector是 @selector(setName:),这个selector是从当前self的class的方法列表开始找的setName,当找到后把对应的 selector传递过去。

而当使用[super setName]调用时,会使用objc_msgSendSuper函数,看下objc_msgSendSuper的函数定义:

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

第一个参数是个objc_super的结构体,第二个参数还是类似上面的类方法的selector,先看下objc_super这个结构体是什么东西:

 struct objc_super {
id receiver;
Class superClass;
};

可以看到这个结构体包含了两个成员,一个是receiver,这个类似上面objc_msgSend的第一个参数receiver,第二个成员是记 录写super这个类的父类是什么,拿上面的代码为例,当编译器遇到Son里setName:andAge方法里的[super setName:]时,开始做这几个事:

1,构建objc_super的结构体,此时这个结构体的第一个成员变量receiver就是son,和self相同。而第二个成员变量superClass就是指类Father,因为Son的超类就是这个Father。

2,调用objc_msgSendSuper的方法,将这个结构体和setName的sel传递过去。函数里面在做的事情类似这样:从 objc_super结构体指向的superClass的方法列表开始找setName的selector,找到后再以 objc_super->receiver去调用这个selector,可能也会使用objc_msgSend这个函数,不过此时的第一个参数 theReceiver就是objc_super->receiver,第二个参数是从objc_super->superClass中找到 的selector

里面的调用机制大体就是这样了,以上面的分析,回过头来看开始的代码,当输出[self class]和[super class]时,是个怎样的过程。

当使用[self class]时,这时的self是Son,在使用objc_msgSend时,第一个参数是receiver也就是self,也是 Son* son这个实例。第二个参数,要先找到class这个方法的selector,先从Son这个类开始找,没有,然后到Son的父类 Father中去找,也没有,再去Father的父类NSObject去找,一层一层向上找之后,在NSObject的类中发现这个class方法,而 NSObject的这个class方法,就是返回receiver的类别,所以这里输出Son。

当使用[super class]时,这时要转换成objc_msgSendSuper的方法。先构造objc_super的结构体吧,第一个成员变量就是self, 第二个成员变量是Father,然后要找class这个selector,先去superClass也就是Father中去找,没有,然后去Father 的父类中去找,结果还是在NSObject中找到了。然后内部使用函数objc_msgSend(objc_super->receiver, @selector(class)) 去调用,此时已经和我们用[self class]调用时相同了,此时的receiver还是Son* son,所以这里返回的也是Son。


Odoo模块继承实战:模型、视图与方法重写完整指南 在Odoo二次开发中,继承机制是扩展标准功能的核心基础,也是避免升级冲突、实现多模块共存的关键工程实践。通过模型继承,开发者可以在不修改源码的前提下为既有模型新增字段、约束和方法;视图继承则利用xpath精准调整界面布局,让业务展示随需求灵活变化;而方法重写配合super()调用,能够优雅地干预核心业务逻辑。这些技术不仅适用于自定义客户等级、扩展采购订单等常见场景,更是构建可维护、可交付项目模块的必备技能。深入理解并使用模块继承,意味着开发者可以从低效的源码修改中彻底解放出来,真正实现按需定制与平滑升级。本 阅读详情

相关推荐

iOS网址处理指南:快捷指令、URL Scheme与WebView拦截

在移动端,网址处理是连接系统能力与业务场景的关键环节。iOS通过快捷指令、URL Scheme与Universal Link、WKWebView导航代理等机制,构建了一套从用户操作到应用跳转、再到网页拦截的完整技术体系。其中,URL Scheme与Universal Link解决了应用间通信与网页唤起App的问题,而WKWebView的导航代理则允许开发者在页面加载前精确控制链接行为。理解这些概念与原理,不仅能帮助普通用户将高频网址转化为桌面入口,提升日常操作效率,也能让开发者在App内实现自定义协议解析、

weixin_34337381的博客 299

iOS[super class]和[self class]

最近小编所在公司招 iOS 开发职位,小编也出了几道面试题考察下候选人的 iOS 开发水平,其中有一道题如下: @implementation Student : Person - (instancetype)init { self = [super init]; if (self) { id obj1 = [self class]; id obj2 = [super cla...

weixin_34061555的博客 209

Objective-C入门指南:从环境搭建到实战项目开发

面向对象编程是现代软件开发的核心范式之一,它通过封装、继承和多态等机制组织代码,提升可维护性和复用性。在iOS/macOS生态中,Objective-C作为基于C语言的面向对象语言,其独特的消息传递机制和动态运行时特性,为理解Cocoa Touch框架的底层原理提供了关键视角。掌握Objective-C不仅能帮助开发者深入理解iOS系统框架的设计哲学,还能有效维护和迭代大量存量项目代码,尤其是在处理内存管理、与C/C++库桥接以及调试经典崩溃场景时具有不可替代的价值。对于希望夯实iOS开发基础、进入中大型团

weixin_30580341的博客 317

selfClass 与 superClass 的区别

在 Objective-C 中,`[self class]` 和 `[super class]` 都用于获取对象的类信息,但它们在运行时的行为略有不同。理解它们的区别有助于更好地掌握 Objective-C 的消息传递机制和继承关系。

侯仕奇的博客 678

iOS经典面试题之分析self class与super class的区别和底层原理

一、区别与联系 [self class] 就是发送消息 objc_msgSend,消息接收者是 self,方法编号 class; [super class] 本质就是 objc_msgSendSuper,消息的接收者是 self,方法编号 class,在运行时,底层调用的是 _objc_msgSendSuper2; objc_msgSendSuper2 会更快,会直接跳过 self 的查找。 二、代码分析 现有一个 YDWTeacher 类,继承于 YDWPerson 类,在 init 打印 [sel

╰つ栺尖篴夢ゞ 4427

PyTorch Mobile移动端图像分类:模型压缩与部署实战

模型压缩是移动端AI落地的关键技术,通过剪枝、量化和知识蒸馏降低模型参数量和计算量,使其适配手机等资源受限设备。其原理是在保持精度的前提下减少冗余参数和计算,技术价值在于提升推理速度、减小安装包体积和降低功耗。典型应用场景包括移动端实时图像分类、目标检测等。PyTorch Mobile提供了从训练到部署的完整工具链,支持TorchScript转换和端侧推理。本文详细介绍了剪枝、量化、知识蒸馏的具体实现,以及Android和iOS的部署流程和避坑指南。

weixin_33836874的博客 415

iOS—[self class]和[super class]

先上一段代码 Person类继承NSObject Student类继承Person //Person类 继承自NSObject #import <Foundation/Foundation.h> @interface Person : NSObject @end #import "Person.h" @implementation Person @end //Student类 继承自Person #import "Person.h" NS_ASSUME_NONNULL_BEGIN

qq_45836906的博客 532

ICCV 2025 | 哈工大、清华等提出首个双曲学习框架:HLFormer,革新局部相关视频检索

离原点越远,代表的语义越具体(部分)。现有方法大多在传统的欧几里得空间中对视频和文本进行建模,但这往往会导致对视频内在层次结构的错误表示,从而影响检索的准确性。通过UMAP对学习到的帧嵌入进行可视化(如下图),可以观察到,来自同一时刻的视频帧在嵌入空间中聚集在一起,清晰地展示了模型对时序关系的捕捉能力。下图的双曲空间可视化进一步证实了模型的层次建模能力:离原点越近的点,代表的语义层级越高、粒度越粗糙,反之亦然。:既然文本查询描述的是视频的一部分,那么在几何表示上,文本的嵌入向量应该从属于视频的嵌入向量。

我爱计算机视觉 1077

Objective-C方法重写:从运行时机制到iOS开发实战

方法重写是面向对象编程中实现多态性的核心技术,它允许子类重新定义父类的方法行为。其原理基于Objective-C的动态消息传递机制,运行时通过objc_msgSend函数在继承链中查找方法实现,实现动态绑定。这一机制为代码提供了强大的扩展性和灵活性,是构建复杂类层次结构的基石。在iOS开发中,方法重写广泛应用于自定义视图控制器生命周期、定制控件行为以及处理特定业务逻辑等场景。然而,不当的重写可能导致崩溃,例如未正确处理super调用、破坏KVO兼容性或与运行时机制冲突。本文通过一个游戏开发案例,系统解析了O

weixin_33724659的博客 484

华硕ROG幻16笔记本电脑模式切换管理工具完美替代华硕奥创中心管理工具

参考文档1这个工具可以完美替代华硕奥创中心工具,可以定制化不同模式下的CPU、GPU、风扇转速、电池计划等。是由华硕开发人员开发的一个纯绿色的系统管理工具。直接展示启动后的工具界面效果图:这个工具也可以一键式停止正在运行的华硕ASUS服务,减少不必要的资源消耗。

追梦&天空的博客 1万+

Veeam Backup & ONE download

前言 Veeam® Availability Suite™ 是 Veeam 的旗舰解决方案,可实现简单、灵活和可靠的数据管理。消除与数据保护、恢复、监控、勒索软件防护和合规性相关的手动流程,从而减轻数据维护压力。Veeam 能够帮助您节省时间和成本,同时支持您减少在备份方面花费的时间,将更多精力放在推动业务发展上。 Veeam Availability Suite Release 版本 包含 发布时间 复制磁力链接使用迅雷或者bittorrent ...

极致,细节 1997

Eureka 表单框架完全指南:用 Swift 优雅构建 iOS 声明式表单、自定义 Row 与验证体系

Eureka 是一个由 XMARTLABS 用纯 Swift 编写的 iOS 表单生成框架,本质上是经典库 XLForm 的 Swift 重构版本,通过 DSL 式自定义操作符(`+++`、`<<<`、`+=`)让开发者像搭积木一样组合 `Section` 与 `Row`,即可生成完整可交互的表单界面。本文以仓库 [Documentation/README_CN.md](https://link.

gitblog_01171的博客 888

SDR 和 DDR 的区别

SDR 和 DDR 的差别,最明显提现在传输速率和频率上。DDR SDRAM与SDRAM的基本结构是相似的,最根本的区别在于DDR 支持在一个时钟周期内传输两次数据,,SDR 只能传输一次数据。

串起点滴 1958

iOS开发第一行代码:从真机运行到App部署全链路

iOS开发的本质不是语法书写,而是与UIKit、Foundation等系统框架建立运行时契约。其核心原理涵盖应用生命周期管理、事件响应链、主线程调度、权限声明机制及Xcode工程配置逻辑。技术价值在于通过原生API实现可控、可调试、可验证的用户交互——如UIButton点击响应、URLSession网络图片加载、Info.plist权限配置与真机签名部署。典型应用场景包括新手入门实战、企业内部测试分发(TestFlight)、教育类轻量App快速落地。本文聚焦零基础开发者如何亲手完成从代码编写、Auto L

weixin_33979203的博客 390

RK3568平台开发系列讲解(音频篇)配置声卡

📢本篇文章介绍如何配置声卡。

内核笔记 2448

Floyd (弗洛伊德)算法简述

Floyd在1962年由Robert Floyd以其当前公认的形式出版。算法作为三个嵌套for循环的现代公式首先由Peter Ingerman在1962年描述。Floyd 算法是解决图论问题的比较经典的算法,是解决给定的加权图中顶点间的最短路径的一种算法,可以正确处理有向图的最短路径问题。

慕羽★的博客 2万+

黑马程序员——ios开发基础之OC中的面向对象以及对象特性

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 第一讲 1、对象的存储细节               对象的创建:                Student 类            [Student new];           1)申请存储空间          2)给类的成员变量初始化(基本数据类型 0 ,NSSt

Joker_999的博客 822

DSI3协议介绍

分布式系统接口(DSI)是一种通用且功能强大的总线协议,旨在将多个遥感器和执行器设备互连到中央控制模块。该网络的主要目标应用是汽车安全系统。这种应用的一些特点是需要低成本、高鲁棒性、中速互连,仅限于两根导线。此外,它必须具有故障安全性、确定性和良好的EMC特性。即使具有所有级别的智能和可编程性的设备都可以连接到网络,远程设备也必须能够通过简单的状态机实现。由于模块尺寸非常重要,因此中央模块和远程单元中的最小组件至关重要。

汽车电子软件领域知识分享 1万+

iOS面试题总结(一)

1.为什么不能给类别category 添加成员变量?extension呢? 2.isKindOfClass: 和 -isMemberOfClas区别? 3.weak的实现原理 4.理解 [self class] 与 [super class] ? 5.ios中的内存管理机制 6.Block如何访问外部变量? 下划线__block的作用? 如何防止循环引用? 7.Block循环引用问题 (1).为什么Msonry不会循环引用? (2).weakSelf、strongSelf结合使用 8.深拷贝与

feelinghappy的专栏 217

从入门到精通|Yalmip+Cplex在电力系统中的应用(Matlab代码实现)

​ 火电成本包括运行成本、碳捕集成本,其中火电运行成本由运行维护成 本和发电煤耗成本构成,发电煤耗与其出力关系: ,F 为机组煤耗量(kg/h),P 为机组出力/MW;运行维护成本按照 0.5 倍煤耗成本考虑,碳捕集成本取决于碳排放量及碳捕集单价,火电机组相关参数如附表 1 所示,电煤价格为 700 元/t ​

weixin_46039719的博客 1552

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

PyTorch实战5大经典CNN模型:从LeNet到ResNet的工程落地手记

卷积神经网络(CNN)是计算机视觉的基石架构,其核心在于局部感受野、权值共享与层次化特征提取。理解CNN需穿透公式,把握每层卷积核尺寸、通道数、步长与padding的物理意义及其对特征图尺寸和显存占用的影响。现代深度学习框架如PyTorch通过nn.Module封装抽象,但真实落地常卡在数据加载、训练循环、BN统计、设备迁移等工程细节。本文聚焦LeNet-5、AlexNet、VGG-16、GoogLeNet与ResNet-18五大经典结构,结合PyTorch 2.0+实践,解析稀疏连接、1×1瓶颈卷积、残差

weixin_34072458的博客 494

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

IDM激活脚本IAS教程:一键冻结IDM试用期,免费解锁完整下载功能

IAS(IDM Activation Script)是开源的 Windows 脚本工具,靠注册表锁定冻结 IDM 试用期:30 天倒计时一次操作就长期停住,也提供重置和完整激活,全程不碰 IDM 程序文件。 ## 最快上手:IDM一键激活脚本的两条路径 **路径一:PowerShell 一行命令(推荐)** 1. 在开始菜单上点右键,打开 PowerShell(不是 CMD) 2. 粘贴下面

gitblog_01145的博客 344

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

基于 Swift 与 Flutter 平台通道(Platform Channel)调用 iOS 原生服务的完整实战指南

> 本文以 [examples/platform_channel_swift](https://link.gitcode.com/i/da15d26572266d001b00b783b5855417) 示例工程为核心,系统讲解如何在 Flutter 应用中使用 `MethodChannel` 与 `EventChannel` 两类平台通道,通过 Swift 调用 iOS 原生服务(以电池电量与充电

gitblog_00944的博客 14

Objective-C入门指南:iOS开发基石与Swift混编实战

面向对象编程是现代软件开发的核心范式,它通过封装、继承和多态等机制组织代码。在iOS/macOS生态中,Objective-C作为C语言的超集,其独特的消息传递机制和动态运行时特性,构成了Cocoa和Cocoa Touch框架的设计哲学基础。理解Objective-C的原理,不仅能帮助开发者深入掌握内存管理、引用循环等底层机制,更能无缝对接海量存量代码库,提升解决复杂问题的能力。在实际工程中,掌握Objective-C与Swift的混编技巧,是维护大型项目、集成第三方库的关键。本文聚焦Objective-C

weixin_33881140的博客 470

UIkit基本框架

本文包含了IOS界面开发中的常用控件以及其他相关知识,持续更新中

2301_77900444的博客 405
上一篇: iOS经典讲解之实现扫描二维码ZBarSDK的使用
下一篇: iOS经典讲解之UIImage初始化一张图片的方法及优缺点
刘新林
博客等级 码龄11年 72粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值