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