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. BZOJ 1668: [Usaco2006 Oct]Cow Pie Treasures 馅饼里的财富( dp )

    dp , dp[ i ][ j ] = max( dp[ k ][ j - 1 ] ) + G[ i ][ j ] ( i - 1 <= k <= i + 1 , dp[ k ][ j - ...

  2. SQL Server 取前一天的0点和23点59分59秒

    DECLARE @startDate1 DATE; DECLARE @startDate DATETIME; ,@startDate1); ,CONVERT(DATETIME,@startDate1) ...

  3. codeforces 622C. Optimal Number Permutation 构造

    题目链接 假设始终可以找到一种状态使得值为0, 那么两个1之间需要隔n-2个数, 两个2之间需要隔n-3个数, 两个3之间隔n-4个数. 我们发现两个三可以放到两个1之间, 同理两个5放到两个3之间. ...

  4. android-适配Adapter

    Adapter是把数据和用户界面视图绑定到一起的桥梁类,负责创建用来表示父视图中的每一个条目的子视图,并提供对底层数据的访问. public class MainActivity extends Ac ...

  5. xfire发布的Webservice中Spring注入为空的解决方案

    Spring框架使用中注入为空是一个比较头疼的问题,遇到Webservice和Spring框架配合时,这个问题更容易出现并很难发现问题的原因. 在做SSO系统中就遇到这样的问题,在Service的实现 ...

  6. 手工部署Sqlserver CLR程序集

    原文 手工部署Sqlserver CLR程序集 以前一直用VS部署Sqlserver CLR程序集简单省事,现在服务器部署在内网了,必须手动更新部署Sqlserver CLR程序集.    开始以为A ...

  7. [转]WIBKIT技术资料

    WebKit结构和流程分析 http://inedx.blog.hexun.com/28830354_d.html webkit架构 http://inedx.blog.hexun.com/28795 ...

  8. 用git上传项目到github

    1 git  clone  github仓库地址 2 git add . 3 git  commit -m "changes log" 4 git remote add origi ...

  9. 通过自定义window来实现提示框效果

    #import <UIKit/UIKit.h>#import <Foundation/Foundation.h> @interface ZMStatuBarHud : NSOb ...

  10. C语言实验——一元二次方程Ⅱ

    C语言实验--一元二次方程Ⅱ Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 169  Solved: 131 [Submit][Status][Web ...