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

  1. Objective-C 中的协议(@protocol)和接口(@interface)的区别

    Objective-C 中的协议(@protocol),依照我的理解,就是C#, Java, Pascal等语言中的接口(Interface).协议本身不实现任何方法,只是声明方法,使用协议的类必须实 ...

  2. Objective-C中的协议(Protocol)和类别(Category)

    1.什么是协议? 2.协议与类别的声明和使用 1.什么是协议? 在Objective-C中,不支持多继承,即不允许一个类有多个父类,但是OC提供了类似的实现方法,也就是协议.协议有点类似于Java里的 ...

  3. Swift和Objective-C中的协议(protocol)有什么异同

    Swift和Objective-C中的protocol的相同点在于:两者可以被用作代理.Objective-C中的protocol类似于Java中的Interface,在实际开发中主要用与适配器模式( ...

  4. Objective-C( protocol协议)

    protocol 协议 protocol:用来声明方法 1.协议的定义 @protocol 协议名称 <NSObject> // 方法声明列表.... @end 2.如何遵守协议 1> ...

  5. 协议 protocol

    协议声明类需要实现的的方法,为不同的类提供公用方法,一个类可以有多个协议,但只能有一个父类,即单继承.它类似java中的接口. 正式协议(formal protocol)--------------- ...

  6. 窥探Swift之协议(Protocol)和委托代理(Delegate)回调的使用

    协议与委托代理回调在之前的博客中也是经常提到和用到的在<Objective-C中的委托(代理)模式>和<iOS开发之窥探UICollectionViewController(四) - ...

  7. DNS 中的协议字段详细定义

    DNS中的协议字段定义 Table of Contents 1 概述 2 DNS Classes 3 DNS OpCodes 4 DNS RCODEs 5 DNS Label Types 6 DNS资 ...

  8. iOS阶段学习第19天笔记(协议-Protocol)

    iOS学习(OC语言)知识点整理 一.关于协议(Protocol)的介绍 1)概念:协议指多个对象之间协商的一个接口对象,协议提供了一些方法用在协议的实现者和代理者      之间通讯的一种方式 2) ...

  9. 转iOS中delegate、protocol的关系

    iOS中delegate.protocol的关系 分类: iOS Development2014-02-12 10:47 277人阅读 评论(0) 收藏 举报 delegateiosprocotolc ...

随机推荐

  1. VIM在文件夹中查找

    在vim中提供2中方法来在其他文件或者文件夹中搜索字符串,第一种是vimgrep还有一种是grep. 如果只是在当前打开的文件中查找字符串的,使用 :? 后面加上想要搜索的字符串就可以. 这里要解决的 ...

  2. PowerDesigner 基础使用

    建表使用基础 1.打开软件,点击create model(如下图一)or 右上角 文件→建立新模型 or 快捷键 Ctrl+N(如下图二) 2.选择要生成脚本的数据库类型(见上图二) 3.建表(图三) ...

  3. 虎说:bootstrap源码解读(重置模块)

    ------<!--action-->------ 开场show:前不生“不犹豫”,后半生“不后悔”.今天又逃课,我不后悔 素材:推特公司的前端框架bootstrap(下称bt),解读源码 ...

  4. org.apache.tomcat.util.bcel.classfile.ClassFormatException: null is not a Java .class file

    org.apache.tomcat.util.bcel.classfile.ClassFormatException: null is not a Java .class file   在$TOMCA ...

  5. Android应用开发基础篇(12)-----Socket通信

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/03/2378669.html 一.概述 网络通信无论在手机还是其他设备上都应用得非常广泛,因此掌 ...

  6. ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'information_schema'

    在我想把备份的数据库导入到本地数据的时候,发生这个错误,我使用的工具是dbForge Studio for MySQL ERROR 1044 (42000): Access denied for us ...

  7. PHP学习笔记5-类的继承/方法重写

    更改Man.php文件名为People.php,加入代码: public function hi(){ return $this->_name.' say hi'; } 新建文件Man.php: ...

  8. .net mvc RazorEngine 字符串razor参数替换

    在.net中有一个比较好的字符串参数替换的方案RazorEngine推荐大家看看原网站,然后做个小联系然后你就懂啦 首先呢得下载一个吧, vs中tools-> Library Paging Ma ...

  9. ASP.net WebAPI 上传图片

    [HttpPost] public Task<Hashtable> ImgUpload() { // 检查是否是 multipart/form-data if (!Request.Cont ...

  10. QT 判断当前焦点是否在某控件上(使用hasFocus函数,毕竟QT是DIRECTUI,所以这个Focus到底代表了什么呢?)

    ui->pushButtonhasFocus()->hasFocus(); ui->treeWidget->hasFocus();   http://blog.csdn.net ...