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 <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 检查对象能否响应指定的消息,
是避免代理在回调时因为没有实现代理函数而程序崩溃的一个有效的方式

时间: 2024-10-12 19:56:46

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

ios中关于对锚点的理解

锚点在ios中见到的地方不多,大部分用在动画中. 今天看到一个动画,上面都是关于锚点的,锚点这个概念在两年前看cocos2d得基本概念时接触过,当时没怎么看,今天看到了,就在好好的学一下. 看了一篇blog,是关于锚点的,就借鉴一些上面的图像: cocos2d里采用OpenGL ES坐标系,坐标原点在屏幕左下角.而ios采用的是Quartz 2D坐标系,坐标原点在屏幕左上角. 在cocos2d和ios中分别把视图的坐标点设为(10,10),结果如下: 那么什么是锚点呢?下面以一个例子来说明: 比

java中statement、prepareStatement的相关理解

statement使用方法 Statement statement = connection.createStatement(); String queryString = "select username,password from user_table where username='" +       username + "' and password='" + password + "'"; ResultSet resultSet = 

iOS 中delegate的理解与使用(传值)

之前做了半年的iOS,刚入了门,又被拉去转战java,现在iOS的那位大佬离职了,又被弄过来维护app,之前对于iOS中的delegate一直都是半知半解,所以刚好趁着这个机会把我所了解的记下来,以便日后查阅. - delegate的理解 delegate, 也就是代理模式(设计模式的一种),我现在所了解的代理模式是,当我有事要做但是没空的时候,我就可以请别人帮下忙,我告诉你我要做什么,但是具体怎么做,那是你的事了,就比如说,我想去约个妹纸出来玩,但是自己刚好现在有事不能约,或者自己不好意思约,

iOS开发中GCD在多线程方面的理解

GCD为Grand Central Dispatch的缩写. Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法.在Mac OS X 10.6雪豹中首次推出,并在最近引入到了iOS4.0. GCD是一个替代诸如NSThread等技术的很高效和强大的技术.GCD完全可以处理诸如数据锁定和资源泄漏等复杂的异步编程问题. GCD可以完成很多事情,但是这里仅关注在iOS应用中实现多线程所需的一些基础知识. 在开始之前,需要理解是要提供给GCD队列的是代

在iOS中获取UIView的所有层级结构 相关

在iOS中获取UIView的所有层级结构 应用场景 在实际 iOS 开发中,很多时候都需要知道某个 UI 控件中包含哪些子控件,并且分清楚它们的层级结构和自个的 frame 以及 bounds ,以便我们完成复杂的 UI 布局,下面的代码就能很方便的获取某个 UI 控件的所有的层级结构,我们可以用它计算,然后把结果写入到本地磁盘,导出成XML文件,这样我们就可以很直观的看出它内部的细节. /** * 返回传入veiw的所有层级结构 * * @param view 需要获取层级结构的view *

iOS中动画理解

iOS 中5种动画 1.0 UIView 动画; 1 UIImageView *imageView1 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"page1.png"]]; 2 imageView1.backgroundColor = [UIColor redColor]; 3 imageView1.frame = CGRectMake(0, 0, 100, 200); 4 [self.view addSubvi

iOS中的堆(heap)和栈(stack)的理解

操作系统iOS 中应用程序使用的计算机内存不是统一分配空间,运行代码使用的空间在三个不同的内存区域,分成三个段:“text segment “,“stack segment ”,“heap segment ”. 段“text segment ”是应用程序运行时应用程序代码存在的内存段.每一个指令,每一个单个函数.过程.方法和执行代码都存在这个内存段中直到应用程序退出.一般情况下,你不会真的不得不知道这个段的任何事情. 当应用开始以后,函数main() 被调用,一些空间分配在”stack” 中.这

IOS学习 - 方法选择器Selector的相关使用

问题的由来 Objective-C是一门动态的语言,只要有可能,Objective-C总会使用动态的方式来解决问题,比如它尽可能的将编译和连接要做的事推迟到运行时,所以它需要一个强大的运行时系统(runtime)来执行编译好的代码.runtime的角色类似于Objective-C语言的操作系统,是Objective-C的灵魂.Objective-C的很多特性都是基于这个强大的运行时的,是十分值得去学习理解的. 动态语言Objective-C很常见的一个消息发送语句(比较准确的说是消息发送,在不混

iOS中消息的传递机制(KVO、Notification、delegation、block以及target-action)---转载

注1:本文由破船[博客]译自Communication Patterns. 本文目录如下所示: 可用的机制 做出正确的选择 Framework示例 小结 每个应用程序或多或少,都由一些松耦合的对象构成,这些对象彼此之间要想很好的完成任务,就需要进行消息传递.本文将介绍所有可用的消息传递机制,并通过示例来介绍这些机制在苹果的Framework中如何使用,同时,还介绍了一些最佳实践建议,告诉你什么时机该选择使用什么机制. 虽然这一期的主题是关于Foundation Framework的,不过本文中还