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. Linux查找文件内容

    从当前目录递归查找文件名为 .py 中包含 conf 的文件名: find -name "*.py" | xargs grep "conf"

  2. Python内置函数(8)——bytes

    英文文档: class bytes([source[, encoding[, errors]]]) Return a new “bytes” object, which is an immutable ...

  3. performance数据

    // 获取 performance 数据 var performance = { // memory 是非标准属性,只在 Chrome 有 // 财富问题:我有多少内存 memory: { usedJ ...

  4. 一些Linq方法,come on !!

    bool b1 = users.All(u => u.ID == 21); 判断是否元素都满足条件,如果有一个不满足,则返回False,都满足则返回TrueAny() bool b2 = use ...

  5. https和http共存的nginx简单配置

    server{ listen 80; listen 443 ssl; ssl_certificate /usr/local/nginx/ssl/www.demo.com/www.demo.com.cn ...

  6. Android Hybrid App自动化测试实战讲解(基于python)

    1.Hybrid App自动化测试概要 什么是Hybrid App? Hybrid App(混合模式移动应用)是指介于web-app.native-app这两者之间的app,兼具“Native App ...

  7. 一篇文章彻底搞懂es6 Promise

    前言 Promise,用于解决回调地狱带来的问题,将异步操作以同步的操作编程表达出来,避免了层层嵌套的回调函数. 既然是用来解决回调地狱的问题,那首先来看下什么是回调地狱 var sayhello = ...

  8. Docker入门(一)用hello world入门docker

    初识Docker Docker是什么?   Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从Apache2.0协议开源.   Docker 可以让开发者打包他们的应用以及依赖包到一个轻量 ...

  9. 【转载】C#处理空格和换行

    使用C#处理字符串是一个常见的情况,当字符串中含有空格或者换行符号的时候,如果业务需要,我们可以通过相应的方法将之处理掉,处理成不含空格和换行符号的字符串,处理的过程使用到正则表达式. 具体函数处理的 ...

  10. MySQL 笔记整理(6) --全局锁和表锁:给表加个字段怎么有这么多阻碍

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> 6) --全局锁和表锁:给表加个字段怎么有这么多阻碍 数据库锁设计的初衷是处理并发问题.作为多用户共享的资源,当出现并发访问的时候, ...