首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用选择器和NSSelectorFromString将消息发送到对象

是一种在Objective-C中动态调用方法的方式。选择器是一个用于表示方法的标识符,可以通过选择器来调用方法,而不需要明确指定方法的名称。

在Objective-C中,可以使用选择器来动态地调用方法。首先,需要创建一个选择器对象,可以使用@selector()宏来创建选择器。例如,@selector(methodName)可以创建一个表示名为methodName的方法的选择器。

然后,可以使用NSSelectorFromString()函数将选择器的字符串表示转换为选择器对象。例如,可以使用NSSelectorFromString(@"methodName")来创建一个表示名为methodName的方法的选择器。

一旦有了选择器对象,就可以使用performSelector:方法来将消息发送到对象。performSelector:方法会根据选择器对象找到对应的方法,并调用该方法。例如,object performSelector:selector会将选择器表示的方法发送到object对象。

这种动态调用方法的方式在某些场景下非常有用,例如在运行时根据条件来决定调用哪个方法,或者在不知道方法名称的情况下调用方法。

在腾讯云的产品中,与选择器和动态方法调用相关的产品和服务可能包括:

  1. 云函数(Serverless Cloud Function):云函数是一种无服务器计算服务,可以根据事件触发执行代码逻辑。可以使用云函数来动态调用方法,根据事件触发执行相应的逻辑。了解更多信息,请访问:云函数产品介绍
  2. API网关(API Gateway):API网关是一种托管的API服务,可以帮助开发者构建、发布、维护、监控和保护应用程序的API。可以使用API网关来定义API接口,通过调用不同的API接口来实现动态调用方法的功能。了解更多信息,请访问:API网关产品介绍

请注意,以上只是一些可能与选择器和动态方法调用相关的腾讯云产品和服务示例,具体的选择和使用需要根据实际需求进行评估和决策。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

文章目录 一、SEL(selector) 二、IMP(implementation) 三、Method 总结 ​ 在 Objective-C中使用发送消息的形式来调用方法,其中涉及到 Runtime库中定义的...一个方法选择器就是一个C字符串,在OC的运行时被注册。编译器生成选择器在类加载时由运行时自动映射。 ​ 您可以在运行时添加新的选择器,并使用sel_registerName函数检索现有的选择器。 ​...必须从sel_registerName或@selector()(OC编译器指令)返回的值,获得选择器(用NSSelectorFromString也可以)。不能简单地C字符串转换为SEL。...sel_getNameSEL转回成Char*: NSLog(@"%s", sel_getName(selB)); // setTitle: ​ 从sel_getName的源码可以看出SELconst...省去了一些列的查找,直接向对象发送消息,效率会高一些。

76620

runtime的那些事(四)—— selector、IMP、Method

Method ---- 1. selector  selector 是指方法选择器,在面向对象里可以理解为函数的指针。@selector() 作用就是在指定类中寻找指定名称的方法。...允许在运行时添加新的 selector 选择器,并可以使用函数 sel_registerName 检索已有的 selector 选择器。...但是在使用 selector 选择器时,必须使用函数 sel_registerName 或者 Objective-C 编译器的指令 @selector() 返回的值,而不能直接 C字符串强制转换成 SEL...() 通过官方文档对 NSSelectorFromString 的解释,一个方法名的UTF-8编码字符串传给 sel_registerName 函数并返回 SEL;关于 method_getName(...若通过获取到实例对象指定方法的 IMP 并直接调用,则可以绕过消息传递流程,直接执行 IMP 对应的方法,这样可以提升访问效率。

2K20
  • iOS 小技能:Method Swizzling (交换方法的IMP)

    前言 利用Objective-C Runtimee的动态绑定特性,一个方法的实现与另一个方法的实现进行交换。...使用Method Swizzling交换方法,其实就是修改了objc_method结构体中的mthod_imp,即改变了method_namemethod_imp的映射关系 在这里插入图片描述 1.1...在Objective-C中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。因此我们可以在运行时偷换selector对应的方法实现,达到给方法挂钩的目的。...ps :initialize 会在类第一次接收到消息的时候调用 有继承关系的对象swizzle时,先从父对象开始。这样才能保证子类方法拿到父类中的被swizzle的实现。...1.4 initialize +initialize本质为objc/_msgSend,如果子类没有实现initialize则会去父类查找,如果分类中实现,那么会覆盖主类,runtime消息转发逻辑一样

    1.6K10

    K8S学习笔记之使用Fluent-bit容器标准输入输出的日志发送到Kafka

    0x00 概述 K8S内部署微服务后,对应的日志方案是不落地方案,即微服务的日志不挂在到本地数据卷,所有的微服务日志都采用标准输入输出的方式(stdin/stdout/stderr)存放到管道内,容器日志采用的是...目前大部分K8S容器日志都采用Fluent或者Fluent-bit,日志传输到ES集群,本文主要讲使用Fluent-bit容器的日志传输到Kafka。...Fluent-bit并传输到Kafka 详细请看https://github.com/fluent/fluent-bit-kubernetes-logging 1.1 创建Fluent-bit Daemonset使用的...raw.githubusercontent.com/fluent/fluent-bit-kubernetes-logging/master/output/kafka/fluent-bit-ds.yaml 0x02 Fluent-bit输出方向ESKafka...https://github.com/fluent/fluent-bit-kubernetes-logging/tree/master/output/kafka  https://github.com

    2.2K30

    iOS运行时函数替换框架——RSSwizzle

    引言         Objective-C是的运行时特性在iOS开发中应用广泛,通过runtime方法,开发者可以在运行时动态为类添加方法,修改类的方法,系统的class_addMethod()方法class_replaceMethod...()方法可以十分简单的添加修改方法,然而,直接使用这两个函数有时并不安全,其主要问题有如下几点: 1.在进行动态函数修改的时候,有可能其他线程也在做同样的操作。...RSSwizzle框架可以解决上面所有问题,在要求比较高的项目中如果需要使用到运行时函数替换的需求,可以直接使用这个框架。...二、RSSwizzle的使用         RSSwizzle中提供了两种使用方式,一种是通过调用类方法来实现函数的替换,另一种是使用RSSwizzle定义的宏来进行函数的替换。...log Swizzle"); }; }]; } +(void)log{ NSLog(@"Class log"); } 这个函数用来替换类方法,第1个参数为要替换的函数选择器

    1.6K30

    iOS 底层原理探索 之 KVC 我愿称之它为魔法...

    对象符合键值编码时,其属性可通过字符串参数通过简洁、统一的消息传递接口进行寻址。这种间接访问机制补充了实例变量及其相关访问器方法提供的直接访问。 您通常使用访问器方法来访问对象的属性。...相比之下,符合键值编码的对象提供了一个简单的消息传递接口,该接口在其所有属性中保持一致。...这些协议方法使用一个关键参数来搜索它们自己的对象实例以查找访问器、实例变量遵循某些命名约定的相关方法。...代理对象随后任何NSArray接收到的一些组合的消息countOf,objectInAtIndex:AtIndexes: 消息给键-值编码创建它兼容的对象。...此代理对象随后任何NSSet接收到的一些组合信息countOf,enumeratorOfmemberOf:消息以创建它的对象

    41620

    iOS SEL的理解与使用

    有很多人,认为block的推广可取代代理设计模式,其实block并不能取代代理,代理的模式可以让代码逻辑性更强,更整洁,也会有更高的可读性可扩展性。...相比之下,我觉得block更多的是取代了选择器@selector。    @selector是什么?...我们要首先明白SEL,SEL并不是一种对象类型,我们通过xCode的字体颜色就可以判断出来,它是一个关键字,就像int,long一样,它声明了一种类型:类方法指针。其实就可以理解为一个函数指针。...有两种方式: 1、在编译时,使用@selector来取得函数 现在,我们应该明白@selector是什么了,它是一个编译标示,我们通过它来取到相应函数。...myLog = NSSelectorFromString(@"myLogN");     [self performSelector:myLog];     } -(void)myLogN{

    79740

    Runtime应用(三):NSInvocation

    1、解耦 一个大的APP里有多个模块,很多时候模块之间要相互调用、通信,通常情况下,我们都是讲要调用的模块引入进来,然后生成对象,调用其方法。...一个解决思路就是,建立一个中间件Meditor,所有的模块都只有Meditor相互通信,如果要调用其他类,也是通过Meditor来调用,从而达到解耦的目的 2、调用 在 iOS中不通过类可以直接调用某个对象消息方式有两种...cls = NSClassFromString(@"HTOtherModule"); id obj = [[cls alloc]init]; [obj performSelector:NSSelectorFromString...而NSInvocation就是用来制造消息发送的类。...,签名两个是classselector,所以方法参数从第3个开始 [parameters enumerateObjectsUsingBlock:^(id _Nonnull obj,

    19910

    OC学习9——反射机制

    然后通过一个类的Class可以实现获取该类的实例变量、方法等信息,从而可以实现创建对象调用方法的目的。...:该方法需要传入一个SEL参数——OC把方法称为选择器,因此,OC使用SEL对象来代表方法。...为了在程序中动态获得SEL对象,OC提供了如下两种方法来获得: 使用@selector指令来获取房前类中制定的方法,该指令需要用完整的方法签名关键字作为参数,仅有方法名是不够的 使用SEL NSSelectorFromString...: [NSNumber numberWithInt:2]] ; 27 28 //使用performSelector:动态调用move:方法,通过NSSelectorFromString...@selector(move:) , [NSNumber numberWithInt:3]) ; 33 34 //使用objc_msgSend()函数动态调用move:方法,通过NSSelectorFromString

    2.1K50

    ActiveMQ介绍

    创建连接时,分配通信资源以及验证客户端。这是一个相当重要的对象,大多数客户端均使用一个连接来进行所有的消息传送。  连接用于创建会话。Session 是一个用于生成使用消息的单线程上下文。...同样,客户端使用 MessageConsumer 对象从指定的物理目标(在 API 中表示为目标对象)接收消息。消费者可使用消息选择器,借助它,消息服务可以只向消费者发送与选择标准匹配的那些消息。 ...3、ActiveMQ消息选择器 ActiveMQ提供了一种机制,使用它,消息服务可根据消息选择器中的标准来执行消息过滤。...然而,它也使得处理选择标准的消息服务增加了一些额外开销。 消息选择器是用于MessageConsumer的过滤器,可以用来过滤传入消息的属性消息头部分(但不过滤消息体),并确定是否实际消费该消息。...消息选择器是一些字符串,它们基于某种语法,而这种语法是SQL-92的子集。可以消息选择器作为MessageConsumer 创建的一部分。

    1.1K90

    flea-msg使用之JMS初识

    生成消息其实非常简单:客户端使用消息生成器对象(MessageProducer)消息发送到物理目的地(在 JMS API 中由目的地对象表示)。...当会话线程调用消息监听器对象的 onMessage() 方法时,客户端消费消息。 2.5.2 消息选择器 消息消费者可以使用消息选择器消息服务仅传递其属性与特定选择条件匹配的消息。...MyQueueSender Msg1 发送到队列目的地 MyQueue1。然后,MyQueueReceiver 从MyQueue1 中获取消息。 至于更为复杂的场景,我们可以看下图。...消息按照发送的顺序发布到主题,但使用它们的顺序取决于消息过期日期、消息优先级以及是否使用选择器使用消息等因素。 发布者订阅者具有时间依赖性:主题订阅者只能使用在创建订阅后发布的消息。...在要发送的消息中,消息头的 JMSReplyTo 字段设置为该临时目的地。 当消息消费者处理消息时,它检查消息的 JMSReplyTo 字段以确定是否需要应答,并将应答发送到指定的目的地。

    12121

    Objective-C Runtime编程指南(1)

    您只需编写编译Objective-C源代码即可使用它。 编译包含Objective-C类方法的代码时,编译器创建实现该语言动态特性的数据结构函数调用。...类的元素对象结构如图所示: 当一个消息发送到一个对象时,消息传递函数跟随该对象的isa指针,指向在调度表中查找方法selector的类结构。...(self)方法选择器(_cmd)。...要转发一个消息, forwardInvocation: 方法里需要做的是: 检测这个消息需要发送到哪里,然后 用原来的参数发送到那里去 消息可以使用invokeWithTarget:方法发送: - (...或者它可以是一个中转站,所有信息发送到同一个目的地。 它可以一条消息翻译成另一条消息,或者简单地“吞下”一些消息,所以没有响应,也没有错误。

    79120

    消息转发

    这是消息转发的第一步.在这一步骤中,运行时希望能够获得一个方法实现来正确处理这个异常的消息.这里只需要提供一个方法实现就行了,方法的实现主体还在当前对象,处理还在当前类中进行解决.针对类方法实例方法...,我们需要提供一个可以处理该异常方法的对象,这样消息的处理就会转移到我们心提供的类中来进行处理,就跳出来原来的类,使用新的类来处理当前你的方法.而且,有一个很重要的事情,就是类方法不会的消息不能到这一步...) 这是消息转发的第三步,执行这个方法说明之前的时机都未能正常处理异常.而在这个时机中,系统会把现有的异常消息的所有细节(例如方法选择器,方法编码以及参数等)封装成NSInvocation对象传递到对应的方法中....与之前的转发的处理不一样的是,在这个时机里,你可以同时消息转发给多个对象进行处理...._objc_msgForward调用方法时,方法直接进入了消息转发流程,而没有调用真实的实现方法.利用这个特性,我们可以指定方法的调用直接使用_objc_msgForward进行转发,从而拦截到原始方法的实现

    1.7K20

    iOS 如何实现Aspect Oriented Programming (下)

    如果也不是元类,再判断statedClass baseClass是否相等,如果不相等,说明为KVO过的对象,因为KVO的对象isa指针会指向一个中间类。...所有的 swizzling 操作都发生在子类,这样做的好处是你不需要去更改对象本身的类,也就是,当你在 remove aspects 的时候,如果发现当前对象的 aspect 都被移除了,那么,你可以...指向_objc_msgForward _objc_msgForward_stret,可想而知,当selector被执行的时候,也会触发消息转发从而进入forwardInvocation,而我们又对forwardInvacation...因为在执行 remove 操作的时候,其实这个对象相关的数据结构都已经被清除了,即使不去恢复 stu2 的study( ) 的执行,在进入 __ASPECTS_ARE_BEING_CALLED__,由于这个没有响应的...注意如果 originalImplementation为空,那么生成的 NSSelectorFromString(AspectsForwardInvocationSelectorName) 指向 baseClass

    2.4K20

    NIO实现多人聊天室

    如果是连接事件,即有客户端连接这个服务端,就打印出“xxx上线了”;如果是读取事件,表示客户端有人发消息到服务端了,那我们就将消息读取到通道中,最后转成字符串,打印在控制台,并且将该消息发送到其他客户端...发送消息到其他客户端的逻辑也很简单,就是遍历所有注册到选择器上的通道(除了自己),然后消息发送到这些通道中。 最后在main方法中创建服务端对象,开始监听即可。...* 假如A、B、C三个客户端,当前消息是A发来的,那么只转发给BC就可以。...再写一个接收服务端消息的方法,遍历选择器,如果存在有事件发生的通道,就拿到该通道,然后通道中的数据读取出来,打印在控制台。...最后是main方法,先创建客户端对象,然后new一个线程去调用接收消息的方法,然后在启用键盘录入,调用发送消息的方法,以便在控制台发送消息

    85610

    KVO详解(二)

    (2)复写当前监测属性的setter方法,在复写的setter中做两件事情:①setter消息转发到父类,调用父类的setter;②通过遍历对照keypath,找到当前变化的所有监听者,并给这些监听者发送一个监听到变化的消息...,使之在外界对变化进行响应 3,isa-swizzling 当前被KVO监听的实例对象的isa指针修改为指向中间子类 4,存储这条KVO信息 当前的KVO信息封装成一个数据model,并保存到专门的数组中...关于函数式编程,我在之前的文章中有提到过: 1,Block 的高级使用 2,Swift进阶六——函数闭包 函数式编程会将封装粒度降低到函数级别,它会将函数作为封装的基本单元,并且会减少中间不可变因素的产生...在OC中,函数式编程可以通过Block来体现,因此,我们可以通过Block的形式KVO的添加观察者响应变化合二为一。 响应变化的Block的定义放在KVO信息模型中: ?...这样一改造之后,在外界使用的时候,KVO观察者的添加KVO变化的监听就可以一起写了,而不必分开写了: ? 一个循环引用的小问题 接下来说一个小点: ?

    69531

    C++避坑---函数参数求值顺序使用独立语句newed对象存储于智能指针中

    newed对象与智能指针 我们使用《 Effective C++》中的例子,假设有两个函数priorityprocessWight,其对应的原型如下: int priority(); void processWidget...解决这样的问题办法也很简单,就是使用分离语句,std::shared_ptr(new Widget())拎出来,在单独的语句中执行new Widget()表达式shared_ptr构造函数的调用,完成“资源被创建”“资源被管理对象接管”的无缝操作后,智能指针传给processWidget函数。...保证“资源被创建”“资源被管理对象接管”之间不会发生任何干扰。...总 结 虽然C++17已经能够规避到我们上面讨论过的风险,但是考虑到我们代码的普适性,仍建议我们:使用独立语句newed对象存储于智能指针中,来保证“资源被创建”“资源被管理对象接管”之间不会发生任何干扰

    51410

    2023携程面试真题

    选择器(Selectors) Java NIO 的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道...)来构造一个 ObjectOutputStream(对象流)对象,再使用 ObjectOutputStream 对象的 write(Object obj)方法就可以参数 obj 的对象写出。...Kafka 生产者发布的消息发送到 Topic(主题) 中,需要这些消息的消费者可以订阅这些 Topic(主题)。...Topic(主题) : Producer 消息发送到特定的主题,Consumer 通过订阅特定的Topic(主题) 来消费消息。...这样 producer 就可以直接消息发送到目的地了。 11、Kafa consumer 是否可以消费指定分区消息吗?

    20120

    iOS面试题:反射是什么?可以举出几个应用场景么?

    // SEL字符串转换 FOUNDATION_EXPORT NSString *NSStringFromSelector(SEL aSelector); FOUNDATION_EXPORT SEL NSSelectorFromString...这些操作甚至可以由服务器传回来的参数来控制,我们可以服务器传回来的类名方法名,实例为我们的对象。...这时候就需要和后台配合了,我们首先需要和后台商量好返回的数据结构,以及数据格式、类型等,返回后我们按照后台约定的格式,根据后台返回的信息,直接进行反射调用即可。...< 用户年龄 */ /** 使用反射机制反射为SEL后,调用的方法 */ - (void)refreshUserInformation; @end 下面通过反射机制简单实现了控制器跳转的方法,在实际使用中再根据业务需求进行修改即可...因为这篇文章主要是讲反射机制,所以没有使用runtime代码。 简单封装的页面跳转方法,只是做演示,代码都是没问题的,使用时可以根据业务需求进行修改。

    1K20
    领券