Objective中的协议(Protocol)
Objective中的协议(Protocol)
作用:
- 专门用来声明一大堆方法. (不能声明属性,也不能实现方法,只能用来写方法的声明).
- 只要某个类遵守了这个协议.就相当于拥有这个协议中的所有的方法声明.
协议的声明:
@protocol 协议名称 <NSObject>
//方法的声明;
@end
- 新建1个协议的方式. NewFile OC-File - protocol
协议的文件名: .h 并且只有1个.h文件.
在协议中,只能用来声明方法,协议的作用:就是专门用来写方法声明的.
类遵守协议:
- 如果想要让1个类,拥有协议中定义的所有的方法声明.那么就让这个类遵守这个协议.
- 类只要遵守1个协议,那么这个类就拥有了这些协议中定义的所有的方法的声明了.
@interface 类名 : 父类名 <协议名称>
@end
- : 表示继承.
- <> 表示遵守的协议.
- 当1个类,遵守了1个协议,那么就相当于这个类拥有了协议中定义的所有的方法的声明.
这个类只是拥有了这个协议中的方法的声明而已. 没有实现.所以 这个类,就应该实现协议中的方法.
协议和延展的区别:
- 1个延展只能针对1个类.
- 1份协议 可以多个类都来遵守,他们都拥有协议中的方法的声明
- 延展的成员是私有. 协议的成员是公开的
- 1个类遵守1个协议,就相当于这个类拥有这个协议中的方法的声明.
如果类不实现协议中的方法,其实也不会报错.编译器只是会报警告.
但是当创建对象,来调用这个没有实现的协议中的方法的时候,就会报错.
类是单继承. 但是协议可以多遵守:
- 1个类只能有1个父类
- 但是1个类可以同时遵守多个个协议.
@interface 类名 : 父类名 <协议名称1,协议名称2......>
@end
当1个类遵守了多个协议之后,就相当于这个类拥有了所有协议中定义的方法的声明.
那么这个类,就应该实现所有协议中的方法.
如果不实现,其实也不会报错.编译器只是会报警告.
- 但是当创建对象,来调用这个没有实现的协议中的方法的时候,就会报错.
@required 与 @optional
在协议中,如果方法的声明被@required修饰,那么遵守这个协议的类必须要实现这个方法,否则编译器会发出警告.
在协议中,如果方法的声明被@optional修饰,那么遵守这个协议的类可以实现这个方法,也可以不实现这个方法.不实现编译器也不会报警告.
- 其实,无论是@required还是@optional你都可以不实现. 编译器是不会报错的. 仍然可以编译 运行.
作用:
- @required修饰的方法如果遵守协议的类没有实现 编译器给1个警告.
- @optional修饰的方法如果遵守协议的类没有实现 编译器不会给警告.
- 无论是@required还是@optional如果没有实现方法 在运行的时候还是会报错.
- 这两个关键字的主要作用:在于程序员沟通,告诉遵守协议的类 哪些方法是必须要实现的,因为这些方法我会调用.
写协议的人,告诉遵守协议的类 哪些方法必须要实现 哪些方法可以不实现.
协议可以遵守另外1个协议,并且可以遵守多个协议
@protocol 协议名称3 <协议名称1,协议名称2......>
@end
- 那么这个协议3就拥有协议1、协议2……的所有的方法的声明.
如果某个类遵守了协议3.那么这个类就拥有协议1、2、3的所有的方法的声明.
任何协议都必须要间接的或者直接的从NSObject基协议继承.
- 协议可以继承另外1个协议. A 协议 继承了 B协议. 那么A协议中不仅有自己的方法的声明,还有B协议中的方法的声明.
如果有1个类遵守了A协议,那么这个类就拥有了, A、B协议中的所有的方法的声明.
协议之间继承的语法格式:
@protocol A协议名称 <B协议名称>
@end
- 代表A协议继承自B协议, A协议中既有自己的方法声明,也有B协议中的方法声明.
- NSOBject: 这是1个类. 是所有的OC类的基类. 这个类是苹果早就定义好得.
NSOBject: 这也是1个协议. 也是苹果早就定义好得. 这个协议被NSObject类遵守.
- 所以,所有的OC对象都拥有这个协议中的所有的方法.
- 这个协议我们也叫做基协议.
写协议的规范: 任何1个协议,必须要间接的或者直接的去遵守这个NSObject基协议.
协议的名称可以和类的名称相同:
- 如果父类遵守了某个协议,那么父类就相当于拥有协议中方法声明,子类也有了.
- 相当于子类也遵守了这个协议.
Objective中的协议(Protocol)的更多相关文章
- Objective-C 中的协议(@protocol)和接口(@interface)的区别
Objective-C 中的协议(@protocol),依照我的理解,就是C#, Java, Pascal等语言中的接口(Interface).协议本身不实现任何方法,只是声明方法,使用协议的类必须实 ...
- Objective-C中的协议(Protocol)和类别(Category)
1.什么是协议? 2.协议与类别的声明和使用 1.什么是协议? 在Objective-C中,不支持多继承,即不允许一个类有多个父类,但是OC提供了类似的实现方法,也就是协议.协议有点类似于Java里的 ...
- Swift和Objective-C中的协议(protocol)有什么异同
Swift和Objective-C中的protocol的相同点在于:两者可以被用作代理.Objective-C中的protocol类似于Java中的Interface,在实际开发中主要用与适配器模式( ...
- Objective-C( protocol协议)
protocol 协议 protocol:用来声明方法 1.协议的定义 @protocol 协议名称 <NSObject> // 方法声明列表.... @end 2.如何遵守协议 1> ...
- 协议 protocol
协议声明类需要实现的的方法,为不同的类提供公用方法,一个类可以有多个协议,但只能有一个父类,即单继承.它类似java中的接口. 正式协议(formal protocol)--------------- ...
- 窥探Swift之协议(Protocol)和委托代理(Delegate)回调的使用
协议与委托代理回调在之前的博客中也是经常提到和用到的在<Objective-C中的委托(代理)模式>和<iOS开发之窥探UICollectionViewController(四) - ...
- DNS 中的协议字段详细定义
DNS中的协议字段定义 Table of Contents 1 概述 2 DNS Classes 3 DNS OpCodes 4 DNS RCODEs 5 DNS Label Types 6 DNS资 ...
- iOS阶段学习第19天笔记(协议-Protocol)
iOS学习(OC语言)知识点整理 一.关于协议(Protocol)的介绍 1)概念:协议指多个对象之间协商的一个接口对象,协议提供了一些方法用在协议的实现者和代理者 之间通讯的一种方式 2) ...
- 转iOS中delegate、protocol的关系
iOS中delegate.protocol的关系 分类: iOS Development2014-02-12 10:47 277人阅读 评论(0) 收藏 举报 delegateiosprocotolc ...
随机推荐
- Asp.net 提供程序模型
需要说明一下几点 1.什么是提供程序? 2.ASP.NET 4.5 中的提供程序 3.配置提供程序 有一下几种存储状态的方式 1.应用程序状态 2.会话状态 3.高速缓存状态 4.cookie 5.查 ...
- C++ 字符串指针与字符串数组
在做面试100题中第21题时,发现char *astr="abcdefghijk\0";和char astr[]={"abcdefghijk"};有点区别,以前 ...
- w2wp.exe 已附加有调试器,但没有将该调试器配置为调试此未经处理的异常
一.问题描述 昨天系统联调,用到了VS2010 附件进程,把w2wp.exe 进程添加到vs2010 的调试进程中,这样其他系统访问我们系统,就可以捕获断点进行调试 但是,今天F5 调试的时候,发现直 ...
- 打印 PHP $_SERVER 常量
foreach( $_SERVER as $var => $value){ echo $var.' '.$value.'<br>'; };
- hdu 4638 Group 莫队算法
题目链接 很裸的莫队, 就不多说了... #include<bits/stdc++.h> using namespace std; #define pb(x) push_back(x) # ...
- A Byte of Python 笔记(2)基本概念:数、字符串、转义符、变量、标识符命名、数据类型、对象
第4章 基本概念 字面意义上的常量 如5.1.23.9.23e-3,或者 'This is a string'."It's a string!" 字符串等 常量,不能改变它的值 数 ...
- Mongodb备份(mongodump)和恢复(mongorestore)
1.备份: mongodump -d DbName -o /data/backup 2. 恢复: mongorestore -d newDB --drop data/backup/DbName/
- Python collections.defaultdict 笔记
其实defaultdict 就是一个字典,只不过python自动的为它的键赋了一个初始值.这也就是说,你不显示的为字典的键赋初值python不会报错,看下实际例子. 比如你想计算频率 frequenc ...
- poj 2417
Accepted 8508K 391MS C++ 2004B 相比下边,,优化太多太多了... /** baby-step-giant-step 因为数据量太大,,自己写hash **/ #inclu ...
- C——货物管理系统
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> ...