iOS开发之旅--_isa和_imp指针-程序员宅基地

技术标签: python  runtime  移动开发  

iOS开发之旅--_isa和_imp指针

    

一、回顾_isa指针

之前谈到过isa指针,isa指针是一个指向所属类的指针,它标注着一个实例对象的真实类型。

在Object-C中消息机制是依靠objc_msgSend()这个函数发送消息,

objc_msgSend含两个参数:receiver、selector。即:objc_msgSend(receiver, selector);

而objc_msgSend通过isa指针,找到实例对象所属的类,也就找到了其全部父类,如下图所示:

一个方法被调用要经过的真实步骤是这样的:当我门向一个对象发送消息去调用他的方法时,objc_msgSend会根据该实例对象的isa指针去查找该对象的类,然后去查找该类的disptach table中的selector,如果找不到就会依次向上查找它的父类,并在其父类的dispatch table中查找相应的selector,直到NSObject类。一旦找到该selector,objc_msgSend会根据dispatch table中内存地址去调用该selector。这样实现message和selector在执行阶段的动态绑定。为了提高这种查找转发的效率。系统会把所有的selector内存地址和调用过的selector的内存地址缓存起来。而通过类的形式划分不同的缓存区域。每一个类的缓存区域会包括自己的selector和继承自父类的selector,在objc_msgSend去查找disptach table前,会先去检查该类的缓存。如果缓存命中,就直接调用selecotr。

二、了解_imp指针

imp是implementation的缩写,顾名思义imp指针是指向selector的具体实现的指针。在了解IMP指针之前,来探讨一个问题,现在需求是在不影响层级结构和尽量少改动的情况下,让项目中所有viewController的ViewDidLoad方法中打印自己的类型。了解Runtime的同学,可能会想到

method_exchangeImplementations(Method m1, Method m2)


这种方式很轻松的实现了我门的需求,但是作为一个优雅的程序员,就要做优雅的事情。下面就来imp指针。

首先要配置工程

进行如下配置:

 

配置完成,直接上代码:

 

使用imp指针更改方法实现成功。这样做比上一种方式更加优雅。

 

接下来探讨一下method_exchangeImplementations(Method m1, Method m2)方法的实现原理:

从imp指针的地址打印来看貌似这个方法是将两个方法的imp指针做了互换。

 

经过这么多代码的测试,最终印证的还是那句话,imp指针是指向selector具体实现的指针。

附加一下真实imp的具体定义:

转载于:https://my.oschina.net/fadoudou/blog/1799795

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34174132/article/details/91941679

智能推荐

Flex4.5--组件-程序员宅基地

文章浏览阅读153次。Flex4.5--组件 1 Label, TextInput. TextArea, RichText,RichEditableText 以及 Text组件<?xml version="1.0" encoding="utf-8"?><s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xml..._flex4.5 组件

主动防御多种Deepfake模型,北大王选所在AAAI22上提出跨模型通用对抗水印CMUA-Watermark...-程序员宅基地

文章浏览阅读2k次。关注公众号,发现CV技术之美本文分享AAAI 2022论文『CMUA-Watermark: A Cross-Model Universal Adversarial Watermark fo..._cmua-watermark

单应性(homography)变换的公式推导过程_homography svd 求解-程序员宅基地

文章浏览阅读2.8k次。原文地址:http://www.cnblogs.com/ml-cv/p/5871052.html矩阵的一个重要作用是将空间中的点变换到另一个空间中。这个作用在国内的《线性代数》教学中基本没有介绍。要能形像地理解这一作用,比较直观的方法就是图像变换,图像变换的方法很多,单应性变换是其中一种方法,单应性变换会涉及到单应性矩阵。单应性变换的目标是通过给定的几个点(通常是4对点)来得到_homography svd 求解

Android bugreport 分析方法-程序员宅基地

文章浏览阅读2.3k次。Android bugreport是一种用于收集和诊断Android设备上的问题的工具。当用户在Android设备上遇到问题或错误时,bugreport可以捕获与设备状态、系统日志、应用程序信息和其他相关信息有关的详细数据,以帮助开发者分析和解决问题。_bugreport 分析

Redis的三种集群方式_redis集群三种方式-程序员宅基地

文章浏览阅读2.3w次,点赞19次,收藏169次。Redis的常用的集群方式主要有以下3种1:主从复制2:哨兵(Sentinel)3:Cluster一、主从主从其实就是一般包含一个主,一个或多个从,从节点从主节点复制数据,可以实现读写分离,主节点做写,从节点做读。在配置上基本没什么要改的。这里用Linux做演示。//这里启动3个docker,就让5678当主节点吧 docker run -d -p 5678:6379 redis docker run -d -p 5679:6379 redis docker run -d _redis集群三种方式

C语言基础语法scanf_4 输入字符串&混合输入_scanf混合类型输入-程序员宅基地

文章浏览阅读130次。C语言基础语法scanf_4 输入字符串&混合输入_scanf混合类型输入

随便推点

Curve 基于 Raft 的写时延优化-程序员宅基地

文章浏览阅读2.4k次。1 背景Curve(github.com/opencurve/curve)是网易数帆自主设计研发的高性能、易运维、全场景支持的云原生软件定义存储系统,旨满足Ceph本身架构难以支撑的一些场景的需求,于2020年7月正式开源。当前由CurveBS和CurveFS两个子项目构成,分别提供分布式块存储和分布式文件存储两种能力。其中CurveBS已经成为开源云原生数据库Polar..._网易curve 算法

php读取word\pdf等文档的内容,并将其保存到网页中_php 读取word内容并保存入库-程序员宅基地

文章浏览阅读7.1k次。// 建立一个指向新COM组件的索引 $word = new COM(”word.application”) or die(”无法打开 MS Word”); // 显示目前正在使用的Word的版本号 //echo “Loading Word, v. {$word->Version}”; // 把它的可见性设置为0(假),如果要使它在最前端打开,使用1(真) // to open_php 读取word内容并保存入库

HTML&CSS仿京东详情页静态页面制作总结_商品详情页怎么制作html-程序员宅基地

文章浏览阅读4.7k次,点赞3次,收藏42次。仿京东详情页面制作_商品详情页怎么制作html

NVME之Device Self-test Operations_self test option-程序员宅基地

文章浏览阅读5.6k次。NVME协议中关于Device self test 介绍_self test option

intell idea怎么恢复默认设置_instellij idea怎么重置-程序员宅基地

文章浏览阅读2.4w次,点赞9次,收藏5次。intell idea怎么恢复默认设置今天在使用idea的时候修改了快捷键,结果不知道怎么回事其他很多快捷键也都变了,于是尝试恢复默认。发现只要删除以下文件夹下的文件就可以了:C:\Users\Administrator.IntelliJIdea2018.3\config\keymaps..._instellij idea怎么重置

解决“图片因为CSS样式缩放导致变糊问题”_css背景图片放大模糊-程序员宅基地

文章浏览阅读1w次,点赞6次,收藏13次。对于图片的放大缩小,我们都会自然而然的认为:图片放大,会变得模糊,图片变小会变得较为清晰。放大,会把瑕疵更明显的暴露出来;缩小,可以让瑕疵难以发觉。这是生活中的自然现象。但是,这个现象放到网页上的图片就“变了味”。_css背景图片放大模糊