iOS中respondsToSelector与conformsToProtocol的相关理解和使用
时间:2020-04-21
本文章向大家介绍iOS中respondsToSelector与conformsToProtocol的相关理解和使用,主要包括iOS中respondsToSelector与conformsToProtocol的相关理解和使用使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
respondsToSelector相关的方法: -(BOOL) isKindOfClass: classObj 用来判断是否是某个类或其子类的实例 -(BOOL) isMemberOfClass: classObj 用来判断是否是某个类的实例 -(BOOL) respondsToSelector: selector 用来判断是否有以某个名字命名的方法(被封装在一个selector的对象里传递) +(BOOL) instancesRespondToSelector: selector 用来判断实例是否有以某个名字命名的方法. 和上面一个不同之处在于, 前面这个方法可以用在实例和类上,而此方法只能用在类上. -(id) performSelector: selector SEL sel = @selector (start:) ; // 指定action if ([obj respondsToSelector:sel]) { //判断该对象是否有相应的方法 [obj performSelector:sel withObject:self]; //调用选择器方法 } 使用[[UIApplication sharedApplication] keyWindow]查找应用程序的主窗口对象respondsToSelector判断是否实现了某方法 #import @interface Tester : NSObject { } -(void) test:(NSString*) msg; -(void) notImp; @end Tester.m #import "Tester.h" @implementation Tester -(void) test:(NSString*) msg { NSLog(@"%@", msg); } @end 注意:没有实现notImp方法 main.m #import #import "Tester.h" int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; id tester = [[Tester alloc] init];//注意,这里使用id SEL testSelector = @selector(test:); SEL notImpSelector = @selector(notImp:); if([tester respondsToSelector:testSelector]) { //tester.m中实现了test方法 [tester test:@"invoke test method"]; } if([tester respondsToSelector:notImpSelector]) { //test.m中没有实现此主就去 [tester notImp]; } [pool drain]; return 0; } conformsToProtocol:@protocol()是用来检查对象是否实现了指定协议类的方法 //例子如下,在例子当中会有适当的注释,以助理解这个方法: @protocol MyProtocol - (void) doSomething; @end @interface MyClass : NSObject//直接符合协议的类 { } @end @implementation MyClass - (void) doSomething { } @end @interface MyOtherClass : MyClass//继承了符合协议的类,即其父类符合协议。 { } @end @implementation MyOtherClass - (void) doSomething { } @end int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; MyClass *obj_one = [MyClass new]; BOOL one_conforms = [obj_one conformsToProtocol:@protocol(MyProtocol)]; MyOtherClass *obj_two = [MyOtherClass new]; //obj_two是类的实例对象,和父类相关,其父类符合协议,则其亦符合。 BOOL two_conforms = [obj_two conformsToProtocol:@protocol(MyProtocol)]; NSLog(@"obj_one conformsToProtocol: %d", one_conforms);//output:YES NSLog(@"obj_two conformsToProtocol: %d", two_conforms);//output:YES [pool drain]; return 0; } //Output: obj_one conformsToProtocol: 1 obj_two conformsToProtocol: 1 //Whereas: MyOtherClass *obj_two = [MyOtherClass new]; //class_conformsToProtocol是只检查当前类符不符合协议,和其父类无关。 BOOL conforms_two = class_conformsToProtocol([obj_two class], @protocol(MyProtocol)); NSLog(@"obj_two conformsToProtocol: %d", conforms_two);//output:NO //Output: obj_two conformsToProtocol: 0 在代理调用是,检查其代理是否符合协议,或者使用 respondsToSelector 检查对象能否响应指定的消息, 是避免代理在回调时因为没有实现代理函数而程序崩溃的一个有效的方式
原文地址:https://www.cnblogs.com/Free-Thinker/p/12744171.html
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 第二节:Activiti6.0配置文件的读取
- SpringMvc配置文件上传
- 使用web.xml配置SpringMvc(使用Java加载配置)
- SpringMVC配置字符过滤器的两种方式
- SpringMvc使用Json(Java配置方式)
- 使用IDEA创建SpringMvc并整合Thymeleaf(Java配置版)
- Junit报错:Argument(s) are different! Wanted:
- RocketMQ使用过滤器filterServer(4.3版本后)
- Python+Appium运行简单的demo,你需要理解Appium运行原理!
- 网站日志分析完整实践【技术创造101训练营】
- HTML前端知识
- 掌握 AST,轻松落地关键业务「技术创作101训练营」
- 一文轻松学会linux字符设备驱动
- leetcode树之N叉树的前序遍历
- 2020-09-20:如何判断一个数是质数?