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调用的调用时机 * 当视图第一次显示的时候会被调用 * 当这个视图 ...
随机推荐
- SQL-ORDER BY 多字段排序(升序、降序)
ORDER BY _column1, _column2; /* _column1升序,_column2升序 */ ORDER BY _column1, _column2 DESC; /* _col ...
- 2、jQuery选择器
2.1 基本选择器 它有元素Id.Class.元素名.多个选择符组成,通过基本选择器可以实现大多数页面元素的查找. 选择器 功能 返回值 #id 根据给定的ID匹配一个元素 单个元素 element ...
- appendChild append insertBefore prepend
CreateTime--2017年11月2日16:57:59 Author:Marydon appendChild()与append() insertBefore()与prepend()区别与联系 ...
- Oracle怎么导出存储过程
Oracle怎么导出存储过程 http://www.myexception.cn/database/1564245.html 导出: 1, 2,点击输出文件,选择要导出文件,选择要导出的目录以及设置导 ...
- android获取系统应用大小的方法
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-s ...
- SQL 将两个结构相同的表合并到成一个表
select * into 新表名 from (select * from T1 union all select * from T2) 这个语句可以实现将合并的数据追加到一个新表中. 不合并重复数据 ...
- Lintcode---线段树的构造
线段树是一棵二叉树,他的每个节点包含了两个额外的属性start和end用于表示该节点所代表的区间.start和end都是整数,并按照如下的方式赋值: 根节点的 start 和 end 由 build ...
- EF(EntityFramework) Migrations 迁移
1.开启程序包管理器控制台 2.安装EntityFramework PM> Install-Package EntityFramework 3.启用迁移 PM> Enable-Migr ...
- Oracle与Mysql插入多行数据
Oracle 一. insert allinto students values ('b10050501','zl')into students values ('b10050502','zjw')s ...
- redis-cli 常用命令
1.连接操作相关的命令 quit:关闭连接(connection) auth:简单密码认证 2.对value操作的命令 exists(key):确认一个key是否存在 del(key):删除一个key ...