objective C中的@class, SEL , IMP等灵活机制(五)

iOS runtimeIMP指针和消息转发机制Demo iOS runtime的基本应用例子(runtime黑魔法,IMP指针, 消息转发机制) 注释很全, 简单易懂的小demo 立即下载

holydancer原创,如需转载,请在显要位置注明:

转自holydancer的优快云专栏,原文地址:http://blog.youkuaiyun.com/holydancer/article/details/7347399


在objective c中,如果细心的话会发现,每个类中都会自动生成一个class 类型的isa,

@interface NSObject <NSObject> {
     Class    isa;
 }
isa是什么,class又是什么呢,找到Class的定义我们会发现如下:

typedefstruct objc_class *Class;

而objc_class以前的定义又如下,现在据说被封闭了,不知道有没有再作修改,总之方便我们理解就好:

struct objc_class {
     Class isa;
     
     Class super_class;
     
     const char *name;
     
     long version;
     long info;
     
     long instance_size;
     struct objc_ivar_list *ivars;
     struct objc_method_list **methodLists; 
     
     struct objc_cache *cache;
     struct objc_protocol_list *protocols;   
 }
于是我们就有了点头绪了,isa,is a pointer,是个指针(根据网上的资料,这样理解是最贴近事实的,不管你们信不信,反正我是信了),每个类都有一个class类型的指针isa,继承自NSObject中,继承关系,方法变量等信息都存放在isa中,isa作为一个隐藏的属性,会自动生成于每个类之中。有了这个前提,也就可以解释为什么我们可以根据@class来代替任意一个类了,看代码:

Human.h

#import <Foundation/Foundation.h>

@interface Human : NSObject
-(void)say;
@end

Human.m

#import "Human.h"

@implementation Human
-(void)say
{
    NSLog(@"Human中的say方法");
}
@end

main.h

#import <Foundation/Foundation.h>
#import "Human.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
        Class c =NSClassFromString(@"Human");
        [[c new] say];
        //以上CLASS类型的c,就相当于Human类。
    }
    return 0;
}

class可以灵活的代替别的类,SEL与其类似,不同的是SEL代替的是方法,可以方便的代替其他方法,class中是因为有isa属性保存有类的信息,而SEL是因为即使是在不同的类中,方法名只要相同,这两个方法的ID就相同,SEL就是根据这个ID来找到该方法,再根据调用该方法的类的不同来找到唯一的地址。看代码再作解释:

#import <Foundation/Foundation.h>


#import <Foundation/Foundation.h>

@interface Human : NSObject
-(void)say;
@end
@implementation Human
-(void)say
{
    NSLog(@"Human中的say方法");
}
@end
//上面定义了一个human类,里面有一个say方法
@interface man:NSObject
{}
-(void)say; @end

@implementation man
-(void)say
{
    NSLog(@"man中的say方法");
}
@end

//在上面定义了一个man类,同样有一个say方法
int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
        Class a =NSClassFromString(@"Human");
        Class b =NSClassFromString(@"man");
        //根据方法名say找到该方法的id,将sel与其绑定;
        SEL sel = NSSelectorFromString(@"say");
        [[a new] performSelector:sel];
        [[b new] performSelector:sel];
        
        
        
    }
    return 0;
}

结果如下:

2012-03-13 10:13:24.900 String[2725:403] Human中的say方法
2012-03-13 10:13:24.901 String[2725:403] man中的say方法


通过以上代码我们会发现,SEL通过方法名绑定后,可以被多个类实例调用,找了些网上的资料,解释都是说方法名一样的话,ID会一样,地址仍不同,才会实现这样的效果,我们不谈论是否准确,但我个人认为这是目前最合理的解释。这种用法的优势一方面是灵活性更高,类似于多态,另一方面是,这种用法sel找方法时匹配的是ID而不是字符串方法名,所以在效率上会高一些。还有一种更终极的方法,直接对应方法的地址,这种方法效率最高,请看代码:

#import <Foundation/Foundation.h>


#import <Foundation/Foundation.h>

@interface Human : NSObject
-(void)say;
@end
@implementation Human
-(void)say
{
    NSLog(@"Human中的say方法");
}
@end
//上面定义了一个human类,里面有一个say方法
@interface man:NSObject
{}
-(void)say; @end

@implementation man
-(void)say
{
    NSLog(@"man中的say方法");
}
@end

//在上面定义了一个man类,同样有一个say方法
int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
        Human *human =[Human new];
        man *ma=[man new];
        //根据方法名say找到该方法的id,将sel与其绑定;
        SEL sel =@selector(say);//也可以这样写:SEL sel=NSSelectorFromString(@"say");
        IMP imp1 = [human methodForSelector:sel];     
        IMP imp2 = [ma methodForSelector:sel];     

        imp1(human,sel);
        imp2(ma,sel);
        //因为每个方法都有自己的地址,这种方式直接找到地址区分相同ID的方法,效率最高,但灵活性不如SEL方式。
        
    }
    return 0;
}

输出语句:

2012-03-13 10:35:21.446 String[3763:403] Human中的say方法
2012-03-13 10:35:21.450 String[3763:403] man中的say方法


今天这些内容不太好理解,我用自己理解的方式给大家再解释一遍,class用于代替类,增加灵活性,因为我们不知道什么时候会用到什么类,方法也是如此,所以SEL可以代替方法,每个方法有方法名,ID,地址,相同的方法名,ID也一样,正常情况下我们根据方法名找到方法,用SEL方法可以根据ID找到方法,而用IMP方式可以直接找到地址,但是灵活性不如SEL方法,虽然效率最高。好了,今天到此为止。


关键字:objective-c ,objective c , oc ,@class, SEL ,selector ,IMP


探索Three.js:利用ShaderMaterial实现动态着色器特效 本文深入探讨了Three.js中ShaderMaterial的应用,指导开发者利用GLSL编写自定义着色器实现动态特效。文章从核心概念GLSL、Uniforms与Attributes讲起,通过创建动态颜色变化平面的实战案例,逐步进阶到实现波纹扩散与动态光影等高级效果,并提供了性能优化与调试技巧,帮助读者掌握创建高性能WebGL视觉特效的关键技能。 阅读详情

相关推荐

5种超实用方法:快速获取Windows文件夹下所有文件名(含CMD/PowerShell脚本)

本文详细介绍了5种快速获取Windows文件夹下所有文件名的实用方法,包括图形界面操作、Excel数据导入、CMD命令和PowerShell脚本。特别提供了高效的CMD和PowerShell脚本示例,帮助用户轻松实现文件名的批量获取与管理,大幅提升工作效率。

opencv7vision的博客 449

Objective-C IMP使用

Objective-C 运行时寻找匹配消息的IMP(implementation) 运行时方法的结构(用户不可见): struct objc_method { SEL method_name; char * method_types; IMP method_imp; }; typedef objc_method Method; 参数说明: method_name

hetao220284的专栏 871

HDMI协议介绍(二)--DataIsland Packets

前文简单介绍了HDMI传输的三个周期:控制周期、DataIsland周期和Video周期。DataIsland传输音频和辅助数据,这些数据以Packet的形式传输。本文简单介绍DataIsland Packet。

SlamDunk的博客 5673

SEl和IMP

为什么80%的码农都做不了架构师?>>> ...

weixin_34004576的博客 252

状态机设计与实现( stm32小车避障为例)

本文以STM32小车避障为例,介绍了状态机设计与实现方法。首先阐述了状态机的事件驱动特性、清晰结构和易扩展优势,并给出硬件组成框架。核心实现部分展示了状态枚举定义、状态转移图和主循环框架,通过switch-case结构实现状态切换。关键状态示例包括前方扫描和转向决策逻辑,通过传感器数据驱动状态转移。总结指出状态机设计需定义枚举状态、实现状态函数、使用switch跳转并更新全局状态。文章最后声明内容为学习笔记,欢迎读者指正交流。全文结构清晰,代码示例具体,为嵌入式系统状态机设计提供了实用参考。

2302_80219536的博客 1046

深入Google DroidGuard:剖析其自定义虚拟机如何守护Android应用安全(附pcbc文件机制解析)

本文深入解析Google DroidGuard自定义虚拟机如何通过独特的架构设计和加密机制保护Android应用安全。DroidGuard采用动态密钥派生、全加密执行环境和pcbc文件机制,有效防御逆向工程和自动化攻击,为移动安全提供新思路。

weixin_34254464的博客 307

iOS-Runtime之SEL、IMP、Method

它们之间的关系可以这么解释:一个类(Class)持有一个分发表,在运行期分发消息,表中的每一个实体代表一个方法(Method),它的名字叫做选择子(SEL),对应着一种方法实现(IMP)。具体的分析如下: ...

MinggeQingchun的博客 1419

Matlab实现雷达波位编排

1 简介 %本程序用于雷达球坐标系到正弦空间坐标系的转换,以及相控阵雷达的波位编排。 2 完整代码 ​%070228添加波位数据保存clear allclose allclc%波束宽度,单位:度BeamWidth = 3.6;theta05 = round(sin(BeamWidth*pi/180)*1000)/1000;%雷达作用空域AZ = [-15 15]; %方位角范围(雷达球坐标系),单位:度EL = [0 30]; %俯仰角范围(雷

qq_59747472的博客 2479

iOS中的SEl和IMP到底是什么

SEL : 类成员方法的指针,但不同于C语言中的函数指针,函数指针直接保存了方法的地址,但SEL只是方法编号。 IMP:一个函数指针,保存了方法的地址 IMP和SEL关系 每一个继承于NSObject的类都能自动获得runtime的支持。在这样的一个类中,有一个isa指针,指向该类定义的数据结构体,这个结构体是由编译器编译时为类(需继承于NSObject)创建的.在这个结构体中有包括了指

风铃的翼的博客 2919

基于特征模仿的YOLOv5中间层知识蒸馏:原理、实现与实验全解析

目标检测中的模型轻量化是一个关键挑战。本文提出一种基于特征模仿(Feature Imitation)的YOLOv5中间层知识蒸馏方法,通过让学生模型学习教师模型的中间层特征表示,显著提升轻量级检测器的性能。我们将详细阐述蒸馏损失函数的设计、特征对齐策略、训练流程,并提供完整可运行的代码实现。同时,推荐多个适合蒸馏训练的数据集,并通过实验验证方法的有效性。

YOLO 185

uniapp - 解决真机调试报错 request:fail abort statusCode:-1 java.security.cert.CertPathValidatorException: Tr

uni-app,真机调试报错,app端平台,安卓Android,安卓App发布线上报错,打包后接口请求失效了,api接口报错,真机运行安卓app时接口不通且报错,request:failabortstatusCode:-1java.security.cert.CertPathValidatorException:Trustanchorforcertificationpathnotfound.,真机调试,苹果ios真机报错,Uniapp打包到app后报错,uni-app真机调试报错,服务器

🏆 前端领域优质创作者 1万+

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

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

D_猿员的博客 831

ESD防护设计宝典(二十三):ESD与EOS失效差异分析

ESD和EOS是电子制造业面临的两大挑战,随着电子产品向更高集成度、更低工作电压和更高工作频率发展,这一问题将更加突出。根据美国军方上世纪八十年代与可靠性分析中心(RAC)共同建立的现场失效返回程序(FFRP)统计数据,产品现场返回中EOS占比高达46%,而ESD仅占6%,另有6%的案例难以区分是EOS还是ESD。

m0_56451176的博客 322

objective C中的@class, SEL , IMP等灵活机制

原址:http://blog.youkuaiyun.com/holydancer/article/details/7347399 在objective c中,如果细心的话会发现,每个类中都会自动生成一个class 类型的isa, [plain] view plain copy @interface NSObject  {       Class    isa;   

luckypeng的专栏 508

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

OC-@class, SEL , IMP等灵活机制

在objective c中,如果细心的话会发现,每个类中都会自动生成一个class 类型的isa, [plain] view plaincopy @interface NSObject  {        Class    isa;    }   isa是什么,class又是什么呢,找到Class的定义我们会发现如下:

King的专栏 1217

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Objective-C中的@class,SEL和IMP等灵活机制

转自holydancer的优快云专栏,原文地址:http://blog.youkuaiyun.com/holydancer/article/details/7347399在objective c中,如果细心的话会发现,每个类中都会自动生成一个class 类型的isa。@interface NSObject &lt;NSObject&gt; {      Class    isa;  } isa是什么,cla...

weixin_33971130的博客 101

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

上一篇: objective c中的数组和简单操作(四)
下一篇: objective-c中的 内存管理(六)
holydancer
博客等级 码龄15年 474粉丝 59原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值