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调用的调用时机 * 当视图第一次显示的时候会被调用 * 当这个视图 ...
随机推荐
- Android studio及eclipse中的junit单元測试
转载请标明出处:http://blog.csdn.net/nmyangmo/article/details/51179106 前一段时间有人问我单元測试的相关内容,我稍作总结做日志例如以下: 由于我接 ...
- Customize User Interfaces and Pass User Input to Installer Classes
In this article I am going to demonstrate how to customize your MSI install to prompt the user for s ...
- Tmux 的常用命令详解
Tmux 的常用命令详解 常用命令: tmux #开启tmux tmux ls #显示已有tmux列表(C-b s) tmux attach-session -t 数字 #选择tmux C-b c ...
- ES6 箭头函数下的this指向和普通函数的this对比
首先在网上摘抄借鉴了一段代码, 然后再这段代码里面进行分析,通过比较ES6的箭头函数和普通函数的this指指向, 分析其中的不同之处.下面就是代码片段var name = "window&q ...
- ASP.Net 自定义HttpModule注册管道事件
背景: 一个请求在到达处理器时 可能需要做很多重复的工作 比如使用固定的算法推算出用户id 角色 如果在应用程序各处做重复解析 会产生大量代码冗余 还有能想到的诸如记录访问者 应用日志 统计流量 ...
- 【ZYNQ-7000开发之九】使用VDMA在PL和PS之间传输视频流数据
[ZYNQ-7000开发之九]使用VDMA在PL和PS之间传输视频流数据 原创 2016年01月14日 11:35:02 标签: VDMA / zynq / zedbaord / AXI 10384 ...
- [svc][op]pip安装ansible && yum安装python34
相对yum安装,pip安装的好处是jinjia版本到了2.8 pip安装ansible Successfully installed MarkupSafe-1.0 PyYAML-3.12 ansibl ...
- 标志位 last break
last-完成rewrite指令的处理,之后搜索对应的URI和location; break-完成rewrite指令的外理 [root@web01 app]# cat /app/server/ngin ...
- android.util.DisplayMetrics-获取当前屏幕尺寸信息
方法有两种一: DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMet ...
- jsp的页面包含——静态包含、动态包含
一.静态包含:包含的文件可以是jsp文件.html文件.文本文件或者一段java代码.<%@ include file="要包含的文件路径"%> 实质是先将所包含的文件 ...