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使用的更多相关文章

  1. IOS开发——Protocol使用协议

    protocol ['prəutəkɔl] (样例:http://blog.sina.com.cn/s/blog_6aafe9c90100yozz.html ) 一.说明  两个类进行通讯,用协议就比 ...

  2. iOS开发 - Protocol协议及委托代理(Delegate)

    因为Object-C是不支持多继承的,所以很多时候都是用Protocol(协议)来代替.Protocol(协议)只能定义公用的一套接口,但不能提供具体的实现方法.也就是说,它只告诉你要做什么,但具体怎 ...

  3. 浅谈iOS开发的协议(protocol)和代理(delegate)

    协议和代理对于一个新手来说确实不讨好理解,也有很多的iOS开发的老手对此是懂非懂的.网上的很多博文只是讲了怎么使用,并没有说的很明白.下面我谈一下我的理解. 1.你要先搞明白,协议和代理为什么会出现, ...

  4. Ios开发之协议protocol

    Protocol是ios开发中的一个难点也是一个重点,要想使用好,或者理解好它,可能需要时间的累积.今天我们就通过一个例子来简单的看一下,怎么样使用protocol. 我们今天用的例子就是模拟电脑插入 ...

  5. iOS开发系列--Swift进阶

    概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...

  6. iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总

    --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用 ...

  7. IOS开发基础知识碎片-导航

    1:IOS开发基础知识--碎片1 a:NSString与NSInteger的互换 b:Objective-c中集合里面不能存放基础类型,比如int string float等,只能把它们转化成对象才可 ...

  8. ios开发中的小技巧

    在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIViewal ...

  9. iOS开发系列—Objective-C之Foundation框架

    概述 我们前面的章节中就一直新建Cocoa Class,那么Cocoa到底是什么,它和我们前面以及后面要讲的内容到底有什么关系呢?Objective-C开发中经常用到NSObject,那么这个对象到底 ...

随机推荐

  1. 巡风源码阅读与分析---nascan.py

    Nascan是巡风主要是做目标的资产识别(信息收集). nascan.py 文件位于 nascan/nascan.py # coding:utf-8 # author:wolf@YSRC import ...

  2. 上次被人说TK不好咯,这次给你整个高大上的

    0.环境 操作系统:Windows Python版本:3.6.0 1.前言 PyQt是一个创建GUI应用程序的工具包.它是Python编程语言和Qt库的成功融合.Qt库是目前最强大的库之一. 2.效果 ...

  3. BBS论坛(二十)

    20.1.cms添加轮播图后台逻辑代码完成 (1)apps/models.py from exts import db from datetime import datetime class Bann ...

  4. 【Java基础】【21IO(字符流)&字符流其他内容&递归】

    21.01_IO流(字符流FileReader) 1.字符流是什么 字符流是可以直接读写字符的IO流 字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写 ...

  5. 【Java资源免费分享,网盘自己拿】

    JavaSE: Java马士兵:链接:https://pan.baidu.com/s/1jJRvxGi密码:v3xb Java毕向东:链接:https://pan.baidu.com/s/1ggzHk ...

  6. C语言实现二叉树的创建&遍历

    算法思想(重点是递归的使用)  利用扩展先序遍历序列创建二叉链表 采用类似先序遍历的递归算法,首先读入当前根结点的数据,如果是'.'则将当前 树根置为空,否则申请一个新结点,存入当前根结点的数据,分别 ...

  7. 海量大数据大屏分析展示一步到位:DataWorks数据服务对接DataV最佳实践

    1. 概述 数据服务(https://ds-cn-shanghai.data.aliyun.com)  是DataWorks产品家族的一员,提供了快速将数据表生成API的能力,通过可视化的向导,一分钟 ...

  8. [React] react+redux+router+webpack+antd环境搭建一版

    好久之前搭建的一个react执行环境,受历史影响是webpack3.10.0和webpack-dev-server2.7.1的环境,新项目准备用webpack4重新弄弄了,旧的记录就合并发布了(在没有 ...

  9. 这可能是最low的发布dotnet core站点到centos7教程

    前言 不得不说:我在chrome上写了好长一段,贴了23张图,然后一个crash..我想说我电脑上的chrome已经crash太多次了 以后一定要搞离线编辑的. 正文 什么是.net core,bal ...

  10. haproxy使用演示--技术流ken

    haproxy简介 HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.基于合理的配置及优化,完全可以实现单机支持数 以万计的并 ...