• 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 检查对象能否响应指定的消息,
    
    是避免代理在回调时因为没有实现代理函数而程序崩溃的一个有效的方式
  • 相关阅读:
    “阿基里斯与乌龟”的终结性思考
    这个世界本来的样子
    Seven times have I despised my soul 《我曾七次鄙视自己的灵魂》
    Youth is not a time of life, it is a state of mind.
    对于过去所犯的错误,最好的道歉是在将来做正确的事
    使用UltraISO刻录自己的音乐CD步骤
    为什么一个目录里放超过十个Mp4文件会导致资源管理器和播放程序变卡变慢?
    用Perl发送邮件小例子
    用df命令显示磁盘使用量和占用率。
    三个JS函数闭包(closure)例子
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/12744171.html
走看看 - 开发者的网上家园