文档章节

iOS中respondsToSelector与conformsToProtocol的相关理解和使用

hejunbinlan
 hejunbinlan
发布于 2015/08/20 10:07
字数 622
阅读 70
收藏 0

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 <Foundation/Foundation.h>
@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 <Foundation/Foundation.h>
#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<MyProtocol>//直接符合协议的类  
{  
}  
  
@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 检查对象能否响应指定的消息,
是避免代理在回调时因为没有实现代理函数而程序崩溃的一个有效的方式


本文转载自:http://www.lvtao.net/ios/514.html

hejunbinlan
粉丝 42
博文 596
码字总数 21569
作品 0
浦东
高级程序员
私信 提问
iOS 8 : Location Services not working(iOS 8 定位失败)

如果是xcode6和ios 8的话,需要调用 CLLocationManager requestAlwaysAuthorization 方法,具体步骤如下: 1. @interface里: CLLocationManager *locationManager; 2. 初始化: locationMa......

孙哲
2015/04/02
205
0
ios委托关于respondsToSelector的小问题

我是一名ios新手,想向大侠们请教个小问题, 这个里面的respondsToSelector应该怎么理解,求讲解

ios初学者
2012/09/11
3.3K
2
iOS - 更轻量级的 AppDelegate - 面向服务

有没有觉得你的 AppDelegate 太过庞大了?一个 iOS 应用可能集成了大量的服务,第三方服务、推送服务等等,大多数服务功能彼此独立,想不想把它们彻底从 AppDelegate 中拆出来? AppDelegat...

力谱宿云
2016/08/09
675
1
转:基于IOS上MDM技术相关资料整理及汇总

一、MDM相关知识: MDM (Mobile Device Management ),即移动设备管理。在21世纪的今天,数据是企业宝贵的资产,安全问题更是重中之重,在移动互联网时代,员工个人的设备接入企业网络并查...

移动互联百科
2013/10/06
380
0
2018 iOS 面试题大全(补充完整版)

原文地址:2018 iOS 面试题大全 由于原作者并没有继续更新,这里我转过来继续更新下 这个栏目将持续更新--请iOS的小伙伴关注! 1、iOS 应用导航模式有哪些? 2、iOS 中持久化方式有哪些? 3、...

Theendisthebegi
2018/11/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OpenStack 简介和几种安装方式总结

OpenStack :是一个由NASA和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenSta...

小海bug
昨天
5
0
DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
昨天
6
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
昨天
4
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
昨天
7
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部