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)]); // ClassB *b = [ClassB new];
NSLog(@"%d", [b conformsToProtocol:@protocol(MyProtocol)]); //
}
}
程序输出:11
注意:
1.从以上结果可以看出,conformsToProtocol是检查该对象的祖先(注意是祖先而不是父类)和该对象是否实现了协议。即父类符合协议,子类也符合;反之,子类实现了协议父类没有,此时父类不符合协议。
2.protocol中默认方法都是@required而不是@optional
3.虽然ClassA和ClassB中虽然都没有实现g(),但是conformsToProtocol依然返回YES
4.这种情况下,编译器给出警告,而且只是给出父类的警告,子类没有

5.综上,conformsToProtocol这个方法只是判断你在@interface该行后面有没有写上<MyProtocol>,对吗?!
iOS conformsToProtocol的更多相关文章
- iOS中respondsToSelector与conformsToProtocol的相关理解和使用
respondsToSelector相关的方法 : -(BOOL) isKindOfClass: classObj 用来判断是否是某个类或其子类的实例 -(BOOL) isMemberOfClass: ...
- 【疯狂造轮子-iOS】JSON转Model系列之二
[疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...
- iOS开发常用代码块
遍历可变数组的同时删除数组元素 NSMutableArray *copyArray = [NSMutableArray arrayWithArray:array]; NSString *str1 = ...
- iOS开发系列—Objective-C之Foundation框架
概述 我们前面的章节中就一直新建Cocoa Class,那么Cocoa到底是什么,它和我们前面以及后面要讲的内容到底有什么关系呢?Objective-C开发中经常用到NSObject,那么这个对象到底 ...
- iOS运行时编程(Runtime Programming)和Java的反射机制对比
运行时进行编程,类似Java的反射.运行时编程和Java反射的对比如下: 1.相同点 都可以实现的功能:获取类信息.属性设置获取.类的动态加载(NSClassFromString(@“clas ...
- iOS开发——高级特性&Runtime运行时特性详解
Runtime运行时特性详解 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 ...
- IOS开发基础知识--碎片47
1:解决ios静态库中的类别(category)在工程中不能使用 解决方法为:找到 target 的图标,更改其 Other Linker Flags 为: -all_load 或 -force_lo ...
- iOS面试题总结 (三)
22 键值编码KVC KVC全称key valued coding 键值编码 提到KVC,就不能不提反射机制,反射机制就是在运行状态中,对于任意一个类,都能够调用他的所有属性和方法,对于任意一个对象, ...
- iOS开发技巧-2
1,打印View所有子视图 po [[self view]recursiveDescription] 2,layoutSubviews调用的调用时机 * 当视图第一次显示的时候会被调用 * 当这个视图 ...
随机推荐
- ant 重置(修改)DatePicker MonthPicker Cascader 的值
1.清空值 this.props.form.resetFields(); 2.监听 props 的变化,触发 清空按钮 .
- 关于new String(new byte[]{0})
今天在做Zxing的二维码的时候,返回的数据竟然是这个样子,郁闷了一小会,说明我用的这个控件有改进的空间.由于时间的原因,最后还是把这个返回的字符串重新组装. Bundle bundle = data ...
- 《The Story of My Life》Introductiom - Historical and Literary Context - Education of the Deaf and Blind
At the time the Story of My Life was published, the idea of a disabled person as an active member of ...
- STL容器分析--stack
stack,顾名思义,表示栈,先进后出.
- 把一个base64编码的图片绘制到canvas (canvas的图片在转成dataurl)
把一个base64编码的图片绘制到canvas 需要引入jquery. <canvas id="myCanvas" width="800" height= ...
- vivado error [Labtools 27-2149]
使用vivado2014.3时遇到了这种错误 ERROR: [Labtools 27-2149] File E:/project/V7_PCIE/prj/PhasedProject/M_PcieGen ...
- poj2392 Space Elevator(多重背包问题)
Space Elevator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8569 Accepted: 4052 ...
- H5area的热区锚点随着图片的尺寸而变化
<area shape="rect" coords="338,308,609,589" > <img id="pic" s ...
- JS继承的6种方法
1.原型链 基本思想:利用原型让一个引用类型继承另外一个引用类型的属性和方法. 构造函数,原型,实例之间的关系:每个构造函数都有一个原型对象,原型对象包含一个指向构造函数的指针,而实例都包含一个指向原 ...
- IntelliJ IDEA Mybatis Plugin 破解安装
破解文件和截图全部在附件中,亲自破解,在使用中,感觉很棒: https://files.cnblogs.com/files/icenter/carck.zip