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

检查on ObjC选择器(SEL)是否有参数

ObjC选择器(SEL)是Objective-C语言中的一种数据类型,用于表示方法的名称。它是一个指向方法的指针,可以在运行时动态地调用方法。

SEL可以用于检查方法是否存在,以及在运行时动态地调用方法。在Objective-C中,方法的名称由方法名和参数类型组成。检查SEL是否有参数意味着检查方法的参数类型是否为空。

在Objective-C中,可以使用以下方法来检查SEL是否有参数:

  1. 使用NSStringFromSelector函数:可以将SEL转换为字符串,并检查字符串中是否包含参数类型。如果字符串中包含冒号(:),则表示SEL具有参数。

示例代码:

代码语言:objective-c
复制
SEL selector = @selector(methodName:);
NSString *selectorString = NSStringFromSelector(selector);

if ([selectorString containsString:@":"]) {
    NSLog(@"SEL has parameters");
} else {
    NSLog(@"SEL does not have parameters");
}
  1. 使用method_getNumberOfArguments函数:可以获取方法的参数个数。如果参数个数大于0,则表示SEL具有参数。

示例代码:

代码语言:objective-c
复制
#import <objc/runtime.h>

SEL selector = @selector(methodName:);
Method method = class_getInstanceMethod([self class], selector);
unsigned int argumentCount = method_getNumberOfArguments(method);

if (argumentCount > 2) { // 参数个数大于2,因为前两个参数是self和_cmd
    NSLog(@"SEL has parameters");
} else {
    NSLog(@"SEL does not have parameters");
}

ObjC选择器(SEL)是否有参数取决于方法的定义。如果方法没有参数,则SEL不包含参数。如果方法有参数,则SEL包含参数。

在云计算领域中,与ObjC选择器(SEL)相关的应用场景可能相对较少。然而,在iOS和macOS开发中,ObjC选择器(SEL)是一种常用的概念,用于实现消息传递和动态方法调用。在云原生应用开发中,可以使用ObjC选择器(SEL)来实现动态加载和调用云服务相关的方法。

腾讯云提供了丰富的云计算产品和服务,可以满足各种应用场景的需求。具体推荐的产品和产品介绍链接地址可以根据实际需求来确定。

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

相关·内容

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

创建 selector 途径sel_registerName @selector() 获取 selector 的途径: NSSelectorFromString() method_getName...但也就意味着编译器并不会检查直接通过 IMP 去执行指定的方法,编译时期编译器并不能判断是否调用 IMP 错误,只有在运行时执行到 IMP 指向的方法实现时,才能判断是否正确。...(*IMP)(id _Nonnull, SEL _Nonnull, ...); #endif  第一个参数传入一个指向 self 指针(指定类生成的实例对象的内存,或者类方法时指向元类的指针),第二个参数传入方法选择器...,后续参数为可配置参数。  ...这样的话,IMP 被定义为无参数无返回类型的函数,关闭即可。还有更高效的方法,就是重新定义一个和参数的 IMP 指针相同类型的指针,并把获取到 IMP 时将其强转为该类型。 ---- 3.

2.1K20

iOS开发-Runtime详解

例如: -class方法返回对象的类; -isKindOfClass: 和 -isMemberOfClass: 方法检查对象是否存在于指定的类的继承体系中(是否是其子类或者父类或者当前类的成员变量)...; -respondsToSelector: 检查对象能否响应指定的消息; -conformsToProtocol:检查对象是否实现了指定协议类的方法; -methodForSelector: 返回指定方法实现的地址...系统的 sel_registerName 函数来获取一个 SEL 类型的方法选择器。...每个方法名都对应一个 SEL 类型的方法选择器,而每个实例对象中的 SEL 对应的方法实现肯定是唯一的,通过一组 id和 SEL 参数就能确定唯一的方法实现地址。...) 方法选择器(_cmd 指向的内容,当前方法的 SEL 指针) 因为在源代码方法的定义中,我们并没有发现这两个参数的声明。

73270
  • iOS开发-Runtime详解

    例如: -class方法返回对象的类; -isKindOfClass: 和 -isMemberOfClass: 方法检查对象是否存在于指定的类的继承体系中(是否是其子类或者父类或者当前类的成员变量)...; -respondsToSelector: 检查对象能否响应指定的消息; -conformsToProtocol:检查对象是否实现了指定协议类的方法; -methodForSelector: 返回指定方法实现的地址...系统的 sel_registerName 函数来获取一个 SEL 类型的方法选择器。...每个方法名都对应一个 SEL 类型的方法选择器,而每个实例对象中的 SEL 对应的方法实现肯定是唯一的,通过一组 id和 SEL 参数就能确定唯一的方法实现地址。...) 方法选择器(_cmd 指向的内容,当前方法的 SEL 指针) 因为在源代码方法的定义中,我们并没有发现这两个参数的声明。

    72990

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

    一个方法选择器就是一个C字符串,在OC的运行时被注册。编译器生成选择器在类加载时由运行时自动映射。 ​ 您可以在运行时添加新的选择器,并使用sel_registerName函数检索现有的选择器。 ​...第一个参数是指向self的指针(实例的内存 或 元类的指针); 第二个参数是方法的选择器; 接下来是方法的参数。...(Class cls, SEL name); // 类实例是否响应指定的selector BOOL class_respondsToSelector(Class cls, SEL sel); IMP的高级作用...(Method m); // result保存方法的返回值,id表示调用这个方法的对象,SEL是Method的选择器,argument是方法的参数。...objc_method结构体中定一个三个属性: method_name:SEL类型(选择器),表示方法名的字符串。

    81120

    Objective-C Runtime详解

    NSObject还有些方法能在运行时获得类的信息,并检查一些特性,比如class返回对象的类;isKindOfClass:和isMemberOfClass:则检查对象是否在指定的类继承体系中;respondsToSelector...:检查对象能否响应指定的消息;conformsToProtocol:检查对象是否实现了指定协议类的方法;methodForSelector:则返回指定方法实现的地址。...SEL objc_msgSend函数第二个参数类型为SEL,它是selector在Objc中的表示类型(Swift中是Selector类)。...selector是方法选择器,可以理解为区分方法的标识,而这个标识的数据结构是SEL: typedef struct objc_selector *SEL; 本质上,SEL只是一个指向方法的指针(准确的说...每个方法名都对应一个SEL类型的方法选择器,而每个实例对象中的SEL对应的方法实现肯定是唯一的,通过一组id和SEL参数就能确定唯一的方法实现地址。

    1.7K60

    iOS运行时Runtime基础

    作为大部分Objective-C类继承体系的根类的NSObject,其本身就具有了一些非常具有运行时动态特性的方法,比如respondsToSelector:方法可以检查在代码运行阶段当前对象是否能响应指定的消息...的交互方式,类似的方法还有如下: -description://返回当前类的描述信息 -class //方法返回对象的类; -isKindOfClass: 和 -isMemberOfClass: //检查对象是否存在于指定的类的继承体系中...-respondsToSelector: //检查对象能否响应指定的消息; -conformsToProtocol: //检查对象是否实现了指定协议类的方法; -methodForSelector...struct objc_selector *SEL; SEL在OC中称作方法选择器,用于表示运行时方法的名字,然而我们并不能在Runtime中找到它的结构体的详细定义。...Objective-C在编译时,会依据每一个方法的名字、参数序列,生成一个唯一的整型标识(Int类型的地址),这个标识就是SEL。 注意: 1.不同类中相同名字的方法对应的方法选择器是相同的。

    92630

    iOS开发·runtime原理与实践: 基本知识篇(类,超类,元类,super_class,isa,对象,方法,SEL,IMP)

    操作函数 // 返回给定选择器指定的方法的名称 const char * sel_getName ( SEL sel ); // 在Objective-C Runtime系统中注册一个方法,将方法名映射到一个选择器...,并返回这个选择器 SEL sel_registerName ( const char *str ); // 在Objective-C Runtime系统中注册一个方法 SEL sel_getUid (...方法调用流程 objc_msgSend() Tour 系列文章通过对 objc_msgSend 的汇编源码分析,总结出以下流程: 2.1 方法调用流程 检查 selector 是否需要忽略 检查 target...例如: -class方法返回对象的类; -isKindOfClass: 和 -isMemberOfClass: 方法检查对象是否存在于指定的类的继承体系中(是否是其子类或者父类或者当前类的成员变量)...; -respondsToSelector: 检查对象能否响应指定的消息; -conformsToProtocol:检查对象是否实现了指定协议类的方法; -methodForSelector: 返回指定方法实现的地址

    1.7K40

    Objective-C Runtime 详解

    NSObject还有些方法能在运行时获得类的信息,并检查一些特性,比如class返回对象的类;isKindOfClass:和isMemberOfClass:则检查对象是否在指定的类继承体系中;respondsToSelector...:检查对象能否响应指定的消息;conformsToProtocol:检查对象是否实现了指定协议类的方法;methodForSelector:则返回指定方法实现的地址。...SEL objc_msgSend函数第二个参数类型为SEL,它是selector在Objc中的表示类型(Swift中是Selector类)。...selector是方法选择器,可以理解为区分方法的标识,而这个标识的数据结构是SEL: typedef struct objc_selector *SEL; 本质上,SEL只是一个指向方法的指针(准确的说...每个方法名都对应一个SEL类型的方法选择器,而每个实例对象中的SEL对应的方法实现肯定是唯一的,通过一组id和SEL参数就能确定唯一的方法实现地址。

    1.2K20

    深入浅出 Runtime(一):初识

    Runtime 两个版本 Objective-C 程序在三个不同的级别上与 Runtime 系统进行交互 Runtime 都有哪些应用?...编译时:编译器将程序代码编译成计算机能够识别的语言,只进行一些简单的语法检查; 运行时:代码跑起来,被装载到内存中去,此时如果出错会导致程序崩溃。...- (BOOL)respondsToSelector:(SEL)sel + (BOOL)respondsToSelector:(SEL)sel // 判断对象是否实现了特定协议中定义的方法 - (BOOL...类相关 // 动态创建一对类和元类(参数:父类,类名,额外的内存空间) Class objc_allocateClassPair(Class superclass, const char *name,...char *method_copyReturnType(Method m) char *method_copyArgumentType(Method m, unsigned int index) // 选择器相关

    1K20

    【IOS开发高级系列】Objective-c Runtime专题总结

    NSObject还有些方法能在运行时获得类的信息,并检查一些特性,比如class返回对象的类;isKindOfClass:和isMemberOfClass:则检查对象是否在指定的类继承体系中;respondsToSelector...:检查对象能否响应指定的消息;conformsToProtocol:检查对象是否实现了指定协议类的方法;methodForSelector:则返回指定方法实现的地址。...2 Runtime术语 id objc_msgSend ( id self, SEL op, ... ); 2.1 SEL         objc_msgSend函数第二个参数类型为SEL,它是selector...不同类中相同名字的方法所对应的方法选择器是相同的,即使方法名字相同而变量类型不同也会导致它们具有相同的方法选择器,于是OC中方法命名有时会带上参数类型(NSNumber一堆抽象工厂方法拿走不谢),Cocoa...每个方法名都对应一个 SEL 类型的方法选择器,而每个实例对象中的SEL 对应的方法实现肯定是唯一的,通过一组 id 和 SEL 参数就能确定唯一的方法实现地址;反之亦然。

    37130

    对象、消息、运行期--12:runtime消息转发

    3.对象可以把其无法解读的某些选择器转交给其他对象处理 4.经过上述两步,如果还是不能处理选择器,那就启动完整的消息转发机制 消息转发全流程.png 动态方法解析(动态添加方法) 当一个实例对象调用一个不存在的方法...)sel 或者 +(BOOL)resolveClassMethod:(SEL)sel #import "Phone.h" #import @implementation...Phone void sayHello(){ NSLog(@"sayHello"); } + (BOOL)resolveInstanceMethod:(SEL)sel{ //判断方法名是否是...sayHello,则加 if ([NSStringFromSelector(sel) hasSuffix:@"sayHello"]) { // 第一个参数:给哪个类添加方法...// 第二个参数:方法名 // 第三个参数:添加方法的函数实现(函数地址) // 第四个参数:函数的类型,(返回值+参数类型) v:void @:对象->self :表示

    17110

    RunTime 之使用前须知

    以及API的参数意义和使用场景。 需要理解如下概念: Class 一种结构体 ISA 一个指向类的指针,每个对象中都存在。 SEL 方法名称的描述。...当一个类方法被调用时,元类会首先查找它本身是否该类方法的实现,如果没有,则该元类会向它的父类查找该方法,直到一直找到继承链的头。...每一个OC实例对象都保存有isa指针和实例变量, 其中isa指针所属类,类维护一个运行时可接收的方法列表(MethodLists) ; 方法列表(MethodLists)中保存选择器的方法名(SEL)和方法实现...,基本的也是经常被提到和用到的动态类型,动态绑定和动态加载。...; respondsToSelector 检查对象能否相应指定的消息; conformsToProtocol 检查对象是否实现了指定协议类的方法; methodForSelector 返回指定方法实现的地址

    73320

    runtime的那些事(一)——runtime基础介绍

    - (BOOL)isMemberOfClass:(Class)aClass //检查对象是否属于指定类 - (BOOL)respondsToSelector:(SEL)aSelector...//检查对象是否响应指定的消息; + (BOOL)conformsToProtocol:(Protocol *)protocol //检查对象是否实现了指定协议类; - (IMP)methodForSelector...代码通过 runtime 的C函数转化后,可以发现: 所有的 Objective-C 方法调用都会在编译时转化成C函数 objc_msgSend 的调用 objc_msgSend 方法一定会有两个参数:...(receiver,selector) 带参数的方法被编译成C函数的结构:objc_msgSend(receiver,selector,org1,org2,…) 运行阶段: 在 recevier(...其次,检查 receiver 是否为 nil 对象,Objective-C 中是允许一个 nil 对象执行任何一个方法而不会 Crash,究其原因在于会被直接 return 忽略掉 3.

    1.5K20
    领券