zoukankan      html  css  js  c++  java
  • 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 检查对象能否响应指定的消息,
    
    是避免代理在回调时因为没有实现代理函数而程序崩溃的一个有效的方式
  • 相关阅读:
    Linux (x86) Exploit 开发系列教程之三(Off-By-One 漏洞 (基于栈))
    Linux (x86) Exploit 开发系列教程之二(整数溢出)
    Linux (x86) Exploit 开发系列教程之一(典型的基于堆栈的缓冲区溢出)
    Linux (x86) Exploit 开发系列教程之四(使用return-to-libc绕过NX bit)
    xss level11
    f.select
    jquery.backstretch
    linux目录或文件权限
    pradino 命令
    Padrino 博客开发示例
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/12744171.html
Copyright © 2011-2022 走看看