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 ...
随机推荐
- typedef使用
1.利用typedef定义函数指针 代码简化,促进跨平台开发 typedef行为有点类似#define 宏,用其实际类型替代同义字. 不同点:typedef 在编译时被解释,因此让编译器来 应付超 ...
- docker基础入门之二
一.docker文件系统: linuxFS包括boot file system 和 root file system boot file system (bootfs),包含bootloader和ke ...
- Node.js笔记2
入门二 5. 事件 Node.js中所有的异步I/O操作完成时都会发送一个事件到事件队列. Events 事件模块 `events.EventEmitter` 简单用法: var EventEmitt ...
- 关于给javascript对象添加、删除、修改对象的属性
以下是自己总结的几种方法 利用动态特性 function Person(){}; var person = new Person(); person.name = 'yy'; person.gende ...
- .NET WIN7+IIS 7.5下URLRewriter组件伪静态设置
原文地址:WIN7+IIS 7.5伪静态的设置 --------------------------------------------------------偶是分割线君-------------- ...
- 2015.8.2 jdbc实现商品类的增删查改
在惠普济宁基地进行了两周sql和java的学习,学到很多东西 刚才实现了用jdbc访问数据库对数据库进行操作,是用eclipse写的,过几天移植到NetBeans上,个人还是比较习惯看图形化界面 前几 ...
- C++内联函数与宏定义
用内联取代宏: 1.内联可调试: 2.可进行类型安全检查或自动类型转换: 3.可访问成员变量. 另外,定义在类声明中的成员函数自动转化为内联函数. 文章(一) 内联函数与宏定义 在C中,常用预处理语句 ...
- php开发中的一些常用统计的日期
<?php echo '<br>今天:<br>'; echo date("Y-m-d",strtotime("now")), &q ...
- cocos2dx中Action汇总
本文由qinning199原创, 转载请注明:http://www.cocos2dx.net/?p=119 今天总结一下cocos2dx中的一些Action动作,其中To表示到达某个点,而By表示偏移 ...
- 加密PHP文件的方式,目测这样可以写个DLL来加密了
<?php function encode_file_contents($filename) { $type=strtolower(substr(strrchr($filename,'.'),1 ...