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>,对吗?!

  • 相关阅读:
    HihoCoder1371
    Intern Day23
    腾讯移动客户端开发暑期实习一面笔试
    C++
    朱丹为什么是文艺青年
    金数据一个不错的调查平台
    单反手动对焦M档,AV,TV,P,A,A-DEP
    chrome不支持字体12px
    火狐解决字体模糊
    《程序员的自我修养》阅读笔记(四):
  • 原文地址:https://www.cnblogs.com/chenyg32/p/4485148.html
Copyright © 2011-2022 走看看