Method和SEL和IMP分别说下再谈下对IMP的理解?(iOS面试题)

iOS Runtime Method Swizzle全解析:从原理到埋点实战与避坑指南 在iOS开发中,Objective-C的动态特性赋予开发者运行时修改方法实现的能力,其核心便是Runtime消息发送机制。每次方法调用都会被转换为objc_msgSend,沿继承链查找SEL对应的IMP,这为Method Swizzle提供了底层支撑。作为AOP切面编程的重要实现手段,Method Swizzle通过交换方法的IMP指针,能在不改动业务源码的情况下为系统方法、自定义类注入统一逻辑,广泛用于页面曝光统计、按钮防重复点击等埋点场景。然而,继承链污染、重复交换、线程安全等问题也给工程落地带来不少风 阅读详情

Method

先看下定义

  1. List item
  2. runtime.h/// An opaque type that represents a method in a class definition.代表类定义中一个方法的不透明类型
  3. typedef struct objc_method *Method;
  4. struct objc_method {
  5. SEL method_name                                          OBJC2_UNAVAILABLE;
    
  6. char *method_types                                       OBJC2_UNAVAILABLE;
    
  7. IMP method_imp                                           OBJC2_UNAVAILABLE;
    
  8. }

Method和我们平时理解的函数是一致的,就是表示能够独立完成一个功能的一段代码,比如:

    • (void)logName
  1. {
  2. NSLog(@“name”);
  3. }

这段代码,就是一个函数。

我们来看下objc_method这个结构体的内容:

  • SEL method_name 方法名
  • char *method_types 方法类型
  • IMP method_imp 方法实现

在这个结构体重,我们已经看到了SEL和IMP,说明SEL和IMP其实都是Method的属性。

我们接着来看SEL。

SEL

还是先看定义

  1. Objc.h
  2. /// An opaque type that represents a method selector.代表一个方法的不透明类型
  3. typedef struct objc_selector *SEL;

这里要先说明下selector和SEL的关系,我在写本文的时候,其实搜索的是selector,直到我看到了selector的定义,才发现我理解一直不对。

  1. @property SEL selector;

在文档中,selector的定义都是这样声明,也就是说:selector是SEL的一个实例,只是在iOS中,selector的使用是如此的频繁,我们才会把他当成一个概念。

selector怎么理解呢?我们可以想想股票,比如市场上有如此多公司在纳斯达克上市,而且他们的名字又非常的长,或者有些公司的名称也是相似的,都是**有限公司。那当市场去指定一个股票的时候,效率会非常低,当你着急想买股票的时候,你会跟你的经纪人说:“hi,peter,给我买一百股Tuniu limited liability company的股票吗?”,也许等你说完,经纪人输入完,市场就变化了,所以纳斯达克通常用代码,比如“TOUR”.这里的selector有类似的作用,就是让我们能够快速找到对应的函数。

文档中是这样讲的:

A method selector is a C string that has been registered (or “mapped“)
with the Objective-C runtime. Selectors generated by the compiler are
automatically mapped by the runtime when the class is loaded.

在iOS中,runtime会在运行的时候,通过load函数,将所有的methodhash然后map到set中。这样在运行的时候,寻找selector的速度就会非常快,不会因为runtime特性牺牲太多的性能。

selector既然是一个string,我觉得应该是类似className+method的组合,命名规则有两条:

  • 同一个类,selector不能重复
  • 不同的类,selector可以重复

这也带来了一个弊端,我们在写C代码的时候,经常会用到函数重载,就是函数名相同,参数不同,但是这在Objective-C中是行不通的,因为selector只记了method的name,没有参数,所以没法区分不同的method。

比如:

1 - (void)caculate(NSInteger)num;
2.
3.- (void)caculate(CGFloat)num;

是会报错的。

我们只能通过命名来区别:

1.- (void)caculateWithInt(NSInteger)num;
2.
3.- (void)caculateWithFloat(CGFloat)num;

IMP

看下IMP的定义

1./// A pointer to the function of a method implementation. 指向一个方法实现的指针
2. typedef id (*IMP)(id, SEL, …);
3.#endif

这个就比较好理解了,就是指向最终实现程序的内存地址的指针。

综上,在iOS的runtime中,Method通过selector和IMP两个属性,实现了快速查询方法及实现,相对提高了性能,又保持了灵活性。

原:https://www.jianshu.com/p/2f1ef81e2b6d

NLP实践——利用自己的语料进行Mask Language Model预训练 #!/usr/bin/env python # coding: utf-8 # In[1]: import os import json import copy from tqdm.notebook import tqdm import torch from torch.optim import AdamW from torch.utils.data import DataLoader, Dataset from transformers import BertForMaskedLM, BertTo 阅读详情

相关推荐

深入解析AXI-Stream协议中的TVALID与TREADY握手时序

本文深入解析AXI-Stream协议中TVALID与TREADY的握手时序,通过实际案例和代码示例详细说明三种典型握手场景及其应用。文章还探讨了常见握手失败案例的解决方法,并介绍了TLAST、TKEEP等高级信号的使用技巧,帮助开发者优化FPGA设计中的数据传输效率。

weixin_29200485的博客 341

iOS面试题:Runtime中,SEL、Method 和 IMP有什么区别,使用场景?

面试题:Runtime中,SEL、Method 和 IMP有什么区别,使用场景? 答:它们之间的关系可以这么解释:一个类(Class)持有一个分发表,在运行期分发消息,表中的每一个实体代表一个方法(Method),它的名字叫做选择子(SEL),对应着一种方法实现(IMP)。具体的分析如下: SEL:定义: typedef struct objc_selector *SEL,代表方法的名称。仅以名字来识别。翻译成中文叫做选择子或者选择器,选择子代表方法在 Runtime期间的标识符。为 SEL类型,虽.

D_猿员的博客 831

科研党必备:用MATLAB批量处理.mat文件数据的3种高效方法

本文为科研人员提供了使用MATLAB批量处理.mat文件数据的三种高效方法,涵盖智能数据加载、专业可视化与自动化报告生成。通过构建自动化框架、多维度数据画图策略及批量处理流程,帮助用户显著提升数据处理效率与图表专业性,解决海量实验数据的管理与分析难题。

weixin_29089057的博客 72

Objective-C Runtime 运行时:方法中 SEL, IMP, Method 的定义与关系

SEL 代表方法的名称。仅以名字来识别。 不论两个类是否存在依存关系,只要他们拥有相同的方法名,那么他们的SEL都是相同的。比如,有n个viewcontroller页面,每个页面都有一个viewdidload,每个页面的载入,肯定都是不尽相同的。但是我们可以通过打印,观察发现,这些viewdidload的SEL都是同一个: SEL sel = @selector(methodName); N...

KingOfOnePiece的博客 847

【Seurat绘图进阶】从参数调优到美学定制:解锁DimPlot与FeaturePlot的隐藏技巧

本文深入探讨了Seurat包中DimPlot与FeaturePlot的进阶使用技巧,旨在解决单细胞数据可视化中的常见痛点。通过参数调优(如order、shuffle、raster)、颜色美学定制(使用RColorBrewer、viridis配色)以及性能优化(栅格化处理),并结合scCustomize包与patchwork排版,帮助用户将基础图表提升为信息清晰、可直接用于论文发表的出版级可视化结果。

lake5的博客 629

国科大学习资料--模式识别与机器学习(黄庆明)--2020期末考试题

国科大学习资料–模式识别与机器学习(黄庆明)–2020期末考试题 国科大学习资料–模式识别与机器学习(黄庆明)–2020期末考试题 国科大学习资料–模式识别与机器学习(黄庆明)–2020期末考试题 ============================================================================================================================================================

无名何许人的博客 2602

iOS_selector、SEL、IMP、Method都是什么,以及之间的关系

在`Objective-C`中使用发送消息的形式来调用方法,其中涉及到`Runtime`库中定义的`SEL`、`IMP`、`Method`,它们分别表示什么,以及它们之间的关系。

mikimo的博客 2974

CANFD加速是什么?和CANFD有什么区别?

在使用CAN设备上位机的时候,已经选择了CANFD,但还有一个选项是“CANFD加速”,那CANFD加速和不加速有什么区别呢?刚接触CANFD小伙伴肯定一脸懵,本篇主要是给大家分享一下他们的区别,如果对你有帮助,请转发,收藏,点赞💐🎉👍😊

汽车电子软件领域知识分享 1035

Method,SEL,IMP

这三个概念,虽然在平时的时候总是在用,但是最近写runtime的时候,又感觉有点糊涂,今天就把他们的关系搞清楚。Method先看下定义runtime.h /// An opaque type that represents a method in a class definition.代表类定义中一个方法的不透明类型 typedef struct objc_method *Method;struct

njafei的博客 924

YOLOv8 置信度阈值 (conf) 和 IoU 阈值 (iou) 详解:如何平衡漏检与误检?

摘要 本文深入探讨了YOLOv8目标检测模型中两个关键参数——置信度阈值(conf)和IoU阈值(iou)的核心作用。文章从目标检测的基础概念出发,解释了置信度分数反映模型预测可靠性,IoU衡量预测框重叠程度。重点剖析了非极大值抑制(NMS)机制如何通过这两个阈值进行预测框筛选:置信度阈值作为初筛门槛,IoU阈值决定重叠框的取舍。通过生动比喻和可视化图表,阐述了合理调节这两个参数能有效平衡误检与漏检问题,是优化YOLOv8模型实际表现的重要技巧。全文以实践为导向,帮助开发者掌握成为"调参大师&qu

深耕 Vue 生态与 JS/TS 技术,聚焦组件封装、响应式原理、TS 类型设计,解析工程化配置与性能优化方案。同时分享 YOLOv8 目标检测实战、AI 大模型面试核心考点,以代码实例拆解技术实现与业务解法。 1247

Open3D (C++) 点云边界提取【2025最新版】

Compute the boundary points of a point cloud.The implementation is inspired by the PCL implementation. Reference:https://pointclouds.org/documentation/classpcl_1_1_boundary_estimation.html

点云侠的博客 871

iOS Runtime《三》Method 和 SEL

1、objc_method_description 结构体 struct objc_method_description { SEL _Nullable name; /**< The name of the method */ char * _Nullable types; /**< The types of the ...

cym_bj 547

OMAPL138使用UPP读写测试

UPP测试代码 #include "hw_types.h" // 宏命令 #include "hw_syscfg0_OMAPL138.h" // 系统配置模块寄存器 #include "soc_OMAPL138.h" // DSP C6748 外设寄存器 #include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明 #include "interrupt.h" // DSP C6748 中断相关应用程序接...

wangjie36的博客 1193

iOS经典面试题

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS开发交流群:130595548,不管你是大牛还是小白都欢迎入驻 ,让我们一起进步,共同发展!(群内会免费提供一些群主收藏的免费学习书籍资料以及整理好的几百道面试题和答案文档!) 1. Runtime 是什么? Runtime是一套有C、C++和汇编混合编写的API,为OC加入了面向对象以及运行时的功能。 运行时是指将数据类型的确定有编译时,推迟到了运行时。 比如:在编译时,只读取macho中的数据到ro,而真正.

iOS-大鑫 214

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

iOS面试题合集--BAT及各大中小型公司

简介 本文主要内容为iOS面试题目,对各个面试题进行一些分类(持续更新),包含了BAT,及各大中小型公司的面试题集合。 正文 中小型公司 谈下iOS开发中知道的哪些锁? 哪个性能最差?SD和AFN使用的哪个? 一般开发中你最常用哪个? 哪个锁apple存在问题又是什么问题? iOS下如何实现指定线程数目的线程池? 如何用HTTP实现长连接? http的post和get啥区别 使用atomic一定是线程安全的吗? 数据库建表的时候索引有什么用? 介绍下iOS设备获取唯一设备号的历史

iOSpipi的博客 381

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

iOS面试题集合(BAT及各大中小型公司)

简介本文主要内容为iOS面试题目,对各个面试题进行一些分类(持续更新),包含了BAT,及各大中小型公司的面试题集合,为大家在找工作的时候提供一点帮助,技术交流q群为150731459,大家互相交流学习原文链接 : 面试题原文链接 : http://www.2bjs.com正文中小型公司 谈下i

Oboe_b的博客 1888

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

iOS面试题(十六)Runtime -- Method-Swizzling

4.动态运行时(RunTime) 基础数据结构 对象、类对象、元类对象是怎么理解的?以及他们之间的关系是怎样的(实例与类对象之间的关系以及类对象与元类对象之间的关系)? OC语言中的消息传递机制是怎样的? 缓存查找 (我们进行方法查找的过程当中,如何进行缓存的方法查找?会使用到系统或者说Runtime中一个方法缓存的机制,这个机制又是怎样运行的呢?) 消息转发流程是怎样的? Me...

ochenmengo的博客 604

玩转iOS开发:装逼技术RunTime的总结篇

文章分享至我的个人技术博客: https://cainluo.github.io/15077238804616.html 讲到这里, RunTime的知识点和应用基本上就已经讲完了, 剩下的就靠大家自己在项目中的应用以及累积了. 这一篇文章主要是 转载声明:如需要转载该文章, 请联系作者, 并且注明出处, 以及不能擅自修改本文. RunTime基础 基础路径图: 在学习RunTime的基础...

weixin_34037977的博客 143

 iOS面试题(十四)Runtime --消息传递机制(缓存查找)

4.动态运行时(RunTime) 基础数据结构 对象、类对象、元类对象是怎么理解的?以及他们之间的关系是怎样的(实例与类对象之间的关系以及类对象与元类对象之间的关系)? OC语言中的消息传递机制是怎样的? 方法缓存 (我们进行方法查找的过程当中,如何进行缓存的方法查找?会使用到系统或者说Runtime中一个方法缓存的机制,这个机制又是怎样运行的呢?) 消息转发流程是怎样的? Me...

ochenmengo的博客 1259

iOS开发-Runtime详解(简书)

简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的。比如: [receiver message]; // 底层运行时会被编译器转化为: objc_msgSend(receiver, selector) // 如果其还有参数比如: [receiver message:(id)arg...]; ...

weixin_34392843的博客 96

360 iOS笔试客观题全解析:从内存管理到RunLoop原理

在移动开发中,iOS面试题常以客观题形式考察开发者对底层原理的理解,其中内存管理、RunLoop、GCD等是高频考点。理解引用计数与block的循环引用,掌握深拷贝与属性修饰符的边界,以及消息发送与消息转发的完整流程,是编写稳定代码的基础。这些原理不仅决定App在复杂交互和弱网环境下的表现,也直接关系到线上崩溃与卡顿的排查效率。无论是准备技术面试还是优化实际项目,系统梳理这些核心知识点都很有必要。从360公司2018春招iOS客观题出发,逐题拆解背后的原理与工程应用,帮助开发者夯实基础、举一反三。

weixin_33787529的博客 325

Runtime面试题

一、objc 对象的 isa 的指针指向什么?有什么作用? 指向他的类对象,从而可以找到对象上的方法 详解:下图很好的描述了对象,类,元类之间的关系: 图中实线是 super_class 指针,虚线是 isa 指针。 1.Root class (class)其实就是 NSObject,NSObject 是没有超类的,所以 Root class(class)的 superclass 指向 nil。 2.每个 Class 都有一个 isa 指针指向唯一的 Meta class 3.Root clas

Rey的技术博客 794

爱奇艺2019秋招iOS笔试B卷:Runtime、内存管理与多线程考点解析

iOS开发中,Runtime消息转发、内存管理机制与多线程模型是决定应用性能与稳定性的核心基石。理解消息转发三个阶段、循环引用产生条件以及GCD死锁与RunLoop的协作原理,能够帮助开发者写出更健壮的代码。这些底层能力不仅用于解决线上疑难问题,也是技术面试与笔试的高频考察方向。以爱奇艺2019秋招iOS笔试题B卷为例,试卷通过具体代码场景考察候选人是否真正理解对象生命周期、引用链和运行时的动态特性。掌握这些通用技术原理,对应对各类iOS岗位考核及日常工程实践均有直接助益。

weixin_34184158的博客 373

小红书iOS开发岗校招笔试复盘:高频考点与编程题解析

移动客户端开发是校招中的热门方向,其中iOS岗位不仅要求扎实的Objective-C与Swift语言基础,更注重对Runtime、内存管理、多线程及UIKit渲染机制等底层原理的理解。在实际笔试中,GCD串行队列同步派发是否导致死锁、RunLoop在滑动场景下的Mode切换、weak修饰符的底层实现等知识点,都是面试官反复考察的重点。与此同时,算法题也占据重要比重,滑动窗口解决最长不重复子串、二叉树层序遍历的变体题目,需要考生具备清晰的逻辑与边界处理能力。面对这类综合性考核,仅靠背诵概念远远不够,而应结合工

weixin_30719711的博客 481

京东2019春招iOS笔试题深度拆解:考点分析与面试指南

Objective-C语言基础和iOS系统机制是移动开发工程师的核心知识体系。Runtime的消息传递与消息转发、内存管理中的引用计数、RunLoop的事件循环与多线程并发模型,这些底层原理决定了开发者能否写出稳定高效的代码。在电商、社交等复杂业务场景中,内存泄漏、线程死锁、卡顿优化等问题都与这些机制直接相关,因此也成为大厂工程师面试的必考内容。以京东2019春招iOS开发类试卷为线索,梳理语言特性、系统机制、架构设计与实战经验等高频考点,帮助准备iOS面试的开发者建立系统化复习路径,并延伸到网络层设计、性

weixin_34293911的博客 419

2018货拉拉iOS笔试题复盘:底层原理与架构设计要点解析

从iOS开发最基础的内存管理和多线程机制出发,理解属性修饰符、Block捕获、RunLoop运行模式等核心原理,是解决日常崩溃和卡顿问题的关键。这些底层概念不仅决定了App的性能表现,也影响着网络层封装、数据缓存及架构选型等工程实践。在实际面试中,面试官往往通过一道综合性笔试题考察候选人对整个iOS开发链路的认知深度。比如货拉拉秋招这套卷三(B),就将OC底层、GCD死锁、Runtime消息转发与架构设计结合,引导开发者从原理出发思考工程方案。本文复盘这套经典笔试题,梳理高频考点与答题思路,帮助正在准备iO

weixin_34267123的博客 378
上一篇: 你们有感觉iOS 要比 Anydroid 要流畅吗?
下一篇: iOS面试合集+答案(一)
iOSpipi
博客等级 码龄5年 4粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值