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. python property装饰器

    直接上代码: #!/usr/bin/python #encoding=utf-8 """ @property 可以将python定义的函数“当做”属性访问,从而提供更加友 ...

  2. SMACSS:一个关于CSS的最佳实践-2.Base Rules

    回顾 在上一篇SMACSS:一个关于CSS的最佳实践-Overview中,讲到SMACSS将CSS Rules分为5个Categories: Base Layout Module State Them ...

  3. OC中使用 static 、 extern、 const使用

    static static用于定义静态变量,静态变量只会被初始化一次,并且直到程序销毁时才会释放 static NSString *str = @"asdfa"; const co ...

  4. UVa1368/ZOJ3132 DNA Consensus String

    #include <stdio.h>#include <string.h> int main(){    int a[4][1000]; // A/C/G/T在每列中出现的次数 ...

  5. Struts2中获取HttpServletRequest,HttpSession等的几种方式

    转自:http://www.kaifajie.cn/struts/8944.html package com.log; import java.io.IOException; import java. ...

  6. CSS复习第一天(简单规范)

    1.有意义的html     优点:与表现性的页面相比,有意义的页面更容易后期的处理与维护.                便于浏览器与屏幕阅读器识别.                更加便于调试样式 ...

  7. Nexus 5 电信破解问题 CDMA_HDR重启会变回LTE

    解决方法是Nexus 5 Field Test Mode -Advanced LTE Settings 关掉LTE 重启就好了 在Android 5.0 下实测成功 如果不行就换一张卡 重新写 重启再 ...

  8. 批量 GBK 转 UTF8 java

    package encoding; import java.io.File; import java.io.IOException; import java.util.Collection; impo ...

  9. linq to entity asp.net mvc 多字段排序

    字段1 降序 字段2 降序 var str = db.xxx.OrderByDescending(p=>p.字段1).ThenByDescending(p=>p.字段2) ThenBy - ...

  10. 射频识别技术漫谈(16)——Mifare UltraLight

    Mifare UltraLight又称为MF0,从UltraLight(超轻的)这个名字就可以看出来,它是一个低成本.小容量的卡片.低成本,是指它是目前市场中价格最低的遵守ISO14443A协议的芯片 ...