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. 未能加载文件或程序集“**, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。试图加载格式不正确的程序。

    未能加载文件或程序集“Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项.试图加载格式不正确的程序. 原来, ...

  2. Java 网络编程(三) 创建和使用URL访问网络上的资源

    链接地址:http://www.cnblogs.com/mengdd/archive/2013/03/09/2951877.html 创建和使用URL访问网络上的资源 URL(Uniform Reso ...

  3. MYSQL存储过程事务列子

    CREATE DEFINER=`root`@`localhost` PROCEDURE `createBusiness`(parameter1 int) BEGIN #Routine body goe ...

  4. Python学习之路——初识Python

    一.第一个程序Hello World: 1.打印输出Hello World: Python2打印方法: >>> print "hello world"hello ...

  5. grunt切换下载源

    nrm 是一个 NPM 源管理器,允许你快速地在NPM 源间切换: 安装:npm install -g nrm 列出可选源:nrm ls 切换:nrm use taobao 测试所有源连接时间:nrm ...

  6. 20 你应该知道的PHP库

    下面是一些非常有用的PHP类库,相信一定可以为你的WEB开发提供更好和更为快速的方法. 图表库 下面的类库可以让你很简的创建复杂的图表和图片.当然,它们需要GD库的支持. pChart – 一个可以创 ...

  7. MySQL对于有大量重复数据表的处理方法

    需要在MySQL的一张innodb引擎的表(tableA)上添加一个唯一索引(idx_col1_u).但是对于每个key(col1)表中已经有大量重复数据.此时,做数据的手工清理,或者SQL处理是非常 ...

  8. config.json ajenti

    {    "users": {        "root": {            "configs": {               ...

  9. iOS9 白名单问题 -canOpenURL: failed for URL: "xx" - error:"This app is not allowed to query for scheme xx"

    [iOS开发]-canOpenURL: failed for URL: "xx" - error:"This app is not allowed to query fo ...

  10. js遍历对象的属性并且动态添加属性

    var person= { name: 'zhangsan', pass: '123' , 'sni.ni' : 'sss', hello:function (){ for(var i=0;i< ...