IOS开发protocol使用
1.什么是protocol?
protocol(协议)是用来定义对象的属性和行为,用于回调。
2.protocol分类?
协议中有三个修饰关键字@required和@optional和@property。
3.三个修饰关键字的作用
被@required修饰的方法为必须实现的方法;
被@optional修饰的方法为可选实现的方法;
@property用于修饰属性。
一、定义一个protocol
新建文件的时候不要选择objective-c Class;而要选择objective-c protocol。
#import <Foundation/Foundation.h> @protocol ClassADelegate <NSObject>
@required//必须实现
- (void)methodA;
@optional//可选实现
- (void)methodB;
@property
NSString *_str;
@end
二、定义protocol的实现(只是定义,对外宣称自己实现了)
A.创建一个objective-c Class,在头文件中实现 ClassADelegate。
#import <Foundation/Foundation.h>
#import "ClassADelegate.h" @interface ClassA : NSObject <ClassADelegate> @end
3.调用protocol中的方法(类似Java中调用interface中的方法)
#import "ViewController.h"
#import "ClassA.h" @interface ViewController ()
@end @implementation ViewController - (void)viewDidLoad
{
[super viewDidLoad]; ClassA *a = [[ClassA alloc] init];
[a methodA];
[a methodB];
}
4.运行程序,发现报错
ProtocolAndDelegate[373:60b] -[ClassA methodA]: unrecognized selector sent to instance 0x17001dff0
原因分析:在第二步里面,只是定义了实现,为真正实现。
在ClassA.m文件的顶部会有警告提示:
Method 'methodA' in protocol not implemented
methodB被@optional修饰,是可选实现,所有没有警告提示;但是运行的时候依然会报错。
5.真正实现协议中的方法
#import "ClassA.h"
@implementation ClassA
- (void)methodA{
NSLog(@"ClassA methodA exec");
}
- (void)methodB{
NSLog(@"ClassA methodB exec");
}
@end
6.再次运行程序
2014-09-25 14:27:17.751 ProtocolAndDelegate[380:60b] ClassA methodA exec
2014-09-25 14:27:17.752 ProtocolAndDelegate[380:60b] ClassA methodB exec
7.respondsToSelector容错处理
协议中的方法如果没有被真正实现,程序是可以编译通过的,但是在运行的时候会出错。特别的是可选实现的方法,未被真正实现的可能性极高,直接调用protocol方法出错的可能性极高。
规定:“出席今天的宴会,可以打领带,也可以不打领带” 绅士打了领带;屌丝为打领带。 此时如果直接去所有赴宴者领带上的花纹,就会出现异常。先判断下这个赴宴者有没有打领带,如果有再获取领带上的花纹。
处理办法如下:
- (void)viewDidLoad
{
[super viewDidLoad]; ClassA *a = [[ClassA alloc] init];
if ([a respondsToSelector:@selector(methodA)]) {
[a methodA];
}
if ([a respondsToSelector:@selector(methodB)]) {
[a methodB];
}
}
IOS开发protocol使用的更多相关文章
- IOS开发——Protocol使用协议
protocol ['prəutəkɔl] (样例:http://blog.sina.com.cn/s/blog_6aafe9c90100yozz.html ) 一.说明 两个类进行通讯,用协议就比 ...
- iOS开发 - Protocol协议及委托代理(Delegate)
因为Object-C是不支持多继承的,所以很多时候都是用Protocol(协议)来代替.Protocol(协议)只能定义公用的一套接口,但不能提供具体的实现方法.也就是说,它只告诉你要做什么,但具体怎 ...
- 浅谈iOS开发的协议(protocol)和代理(delegate)
协议和代理对于一个新手来说确实不讨好理解,也有很多的iOS开发的老手对此是懂非懂的.网上的很多博文只是讲了怎么使用,并没有说的很明白.下面我谈一下我的理解. 1.你要先搞明白,协议和代理为什么会出现, ...
- Ios开发之协议protocol
Protocol是ios开发中的一个难点也是一个重点,要想使用好,或者理解好它,可能需要时间的累积.今天我们就通过一个例子来简单的看一下,怎么样使用protocol. 我们今天用的例子就是模拟电脑插入 ...
- iOS开发系列--Swift进阶
概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...
- iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总
--系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...
- IOS开发基础知识碎片-导航
1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可 ...
- ios开发中的小技巧
在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIViewal ...
- iOS开发系列—Objective-C之Foundation框架
概述 我们前面的章节中就一直新建Cocoa Class,那么Cocoa到底是什么,它和我们前面以及后面要讲的内容到底有什么关系呢?Objective-C开发中经常用到NSObject,那么这个对象到底 ...
随机推荐
- 死磕 java集合之HashMap源码分析
欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. 简介 HashMap采用key/value存储结构,每个key对应唯一的value,查询和修改 ...
- Python操作Redis及连接方式
前沿:随着互联网的高速发展,数据变得越来越重要,Python成为了人工智能的热门语言,而Nosql数据库已成为日常开发用品. 今天要写的是Python操作Redis Redis的安装我就不介绍了,你可 ...
- .NET Core中的CSV解析库
感谢 本篇首先特别感谢从此启程兄的<.NetCore外国一些高质量博客分享>, 发现很多国外的.NET Core技术博客资源, 我会不定期从中选择一些有意思的文章翻译总结一下. .NET ...
- Python爬虫入门教程 4-100 美空网未登录图片爬取
美空网未登录图片----简介 上一篇写的时间有点长了,接下来继续把美空网的爬虫写完,这套教程中编写的爬虫在实际的工作中可能并不能给你增加多少有价值的技术点,因为它只是一套入门的教程,老鸟你自动绕过就可 ...
- VueJs 源码分析 ---(一) 整体对 vuejs 框架的理解
vue-2.x SourceCode vue 2.x 源码解析 关于vue,以及为何要来写这份源码解析的原因 笔者从最开始接触到 vue 应该还是在 15年 10月份左右,当时听说 前端圈中发生很多的 ...
- oracle数据库之plsql可视化操作建表
首先登录PL/SQL developer. 点击工具栏中的第一个图标,选择“表”. 右边会弹出一个窗口,我们以可视化方式来创建一个Table. 如下图所示,在“一般”选项卡中,输入“名称” ...
- Java基础14:离开IDE,使用java和javac构建项目
更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...
- 精读《Serverless 给前端带来了什么》
1. 引言 Serverless 是一种 "无服务器架构",让用户无需关心程序运行环境.资源及数量,只要将精力 Focus 到业务逻辑上的技术. 现在公司已经实现 DevOps 化 ...
- PE知识复习之PE的RVA与FOA的转换
PE知识复习之PE的RVA与FOA的转换 一丶简介PE的两种状态 首先我们知道PE有两种状态.一种是内存展开.一种是在文件中的状态.那么此时我们有一个需求. 我们想改变一个全局变量的初始值.此时应该怎 ...
- SpringMVC学习笔记之二(SpringMVC高级参数绑定)
一.高级参数绑定 1.1 绑定数组 需求:在商品列表页面选中多个商品,然后删除. 需求分析:功能要求商品列表页面中的每个商品前有一个checkbok,选中多个商品后点击删除按钮把商品id传递给Cont ...