zoukankan      html  css  js  c++  java
  • iOS conformsToProtocol

    - (BOOL)conformsToProtocol:(Protocol *)aProtocol;

    是用来检查对象(包括其祖先)是否实现了指定协议类的方法。

    今天遇到一个问题,一个类没有实现protocol中的所有required方法,但是conformsToProtocol依然返回true,这才我很疑惑。于是查了资料并写了以下demo测试下。

    //
    //  main.m
    //  Test
    //
    //  Created by Norcy on 15/5/7.
    //  Copyright (c) 2015年 Norcy. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    
    @protocol MyProtocol <NSObject>
    - (void)f;  //默认是@required
    - (void)g;
    @end
    
    
    @interface ClassA : NSObject<MyProtocol>
    @end
    @implementation ClassA
    - (void)f{}
    @end
    
    
    @interface ClassB : ClassA
    @end
    @implementation ClassB
    - (void)f{}
    @end
    
    
    int main(int argc, const char * argv[])
    {
        @autoreleasepool
        {
            ClassA *a = [ClassA new];
            NSLog(@"%d", [a conformsToProtocol:@protocol(MyProtocol)]);  //1
            
            ClassB *b = [ClassB new];
            NSLog(@"%d", [b conformsToProtocol:@protocol(MyProtocol)]);  //1
        }
    }

    程序输出:11

    注意:

    1.从以上结果可以看出,conformsToProtocol是检查该对象的祖先(注意是祖先而不是父类)和该对象是否实现了协议。即父类符合协议,子类也符合;反之,子类实现了协议父类没有,此时父类不符合协议。

    2.protocol中默认方法都是@required而不是@optional

    3.虽然ClassA和ClassB中虽然都没有实现g(),但是conformsToProtocol依然返回YES

    4.这种情况下,编译器给出警告,而且只是给出父类的警告,子类没有

    5.综上,conformsToProtocol这个方法只是判断你在@interface该行后面有没有写上<MyProtocol>,对吗?!

  • 相关阅读:
    linux中编译C语言程序
    plsql 基础教程(二)
    plsql 基础教程(一)
    plsql开发笔记和小结
    表的约束
    一道面试题:说说进程和线程的区别
    HashTable实现原理
    HashMap、Hashtable、HashSet三种hash集合的区别
    Eclipse快捷键大全
    Statement、 PreparedStatement 、CallableStatement 区别和联系
  • 原文地址:https://www.cnblogs.com/chenyg32/p/4485148.html
Copyright © 2011-2022 走看看