一、概述

Protocol(协议)的声明看起来类似一个类的接口,不同的是Protocol没有父类也不能定义实例变量。Protocol是一种特殊的程序设计结构,用于声明专门被别的类实现的方法。因为OC是单继承的,由于不支持多继承,所以很多时候都是用Protocol和Category来代替实现多继承。Protocol只能定义公用的一套接口,但不能提供具体的实现方法。也就是说,它只告诉你要做什么,但具体怎么做,它不关心。

Protocol的基本用途:

(1)可以用来声明一大堆方法(不能声明成员变量)

(2)只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明

(3)只要父类遵守了某个协议,就相当于子类也遵守了

(4)和java中的接口很相似,但比接口功能更丰富

二、创建与遵守Protocol

1、创建Protocol

创建Protocol很简单,如下图:

比如我们填写的文件名为MyProtocol,之后会生成一个MyPotocol.h文件,文件内容如下:

#import <Foundation/Foundation.h>//注意下面的NSObject是基协议,而不是之前的基类
@protocol MyProtocol <NSObject>//在此声明方法@end

之后我们就在其中声明需要的方法,但要注意的是这里只做声明,不做实现。并且不能声明变量。具体的实现要在遵守这个协议的类中实现,综上,protocol就是用来声明方法的。

协议可用定义在单独.h文件中,也可用定义在某个类中:

(1) 如果这个协议只用在某个类中,应该把协议定义在该类中

(2) 如果这个协议用在很多类中,就应该定义在单独文件中

2、基协议

(1)NSObject是一个基类,是最根本最基本的类,任何其他类最终都要继承它

(2)其实还有一个协议,名字也叫NSObject,它是一个基协议,最根本最基本的协议

(3)NSObject协议中声明了很多最基本的方法,比如description、retain、release等

(4)建议每个新协议都要遵守NSObject协议

3、协议中方法声明的关键字

(1) @required (默认)

要求实现,如果没有实现,会发出警告,但不报错

(2) @optional

不要求实现,不实现也不会有警告

例如:

@require

– (void)test;

@optional

– (void)test2;

4、遵守协议

首先要#import “协议文件名.h”或者@protocol 协议名称,但是使用@protocol 协议名称时只是告诉下面代码这是一个协议,但不知道协议里面有什么东西,一般只在用到协议内容的时候在#import”协议文件名.h”。在实际开发中常用@protocol 协议名称

(1) 类遵守协议

@interface 类名 : 父类名 <协议名称1, 协议名称2>

@end

(2) 协议遵守协议

@protocol 协议名称 <其他协议名称1, 其他协议名称2>

@end

5、定义一个变量的时候,限制这个变量保存的对象遵守某个协议

类名<协议名称> *变量名;

NSObject<MyProtocol> *obj;

id<协议名称> 变量名;

id<MyProtocol> obj2;

如果obj和obj2没有遵守MyProtocol的协议,编译器会警告。

6、@property中声明的属性也可用做一个遵守协议的限制

@property (nonatomic, strong) 类名<协议名称> *属性名;

@property (nonatomic, strong) Dog<MyProtocol> *dog;

@property (nonatomic, strong) id<协议名称> 属性名;

@property (nonatomic, strong) id<MyProtocol> dog2;

三、Protocol的一个简单示例

例如:

我们新建一个Protocol,命名为HelloProtocol,然后就只会生成一个HelloProtocol.h文件,注意肯定没有.m文件,协议只是用来声明方法,并不是来实现的。

#import <Foundation/Foundation.h>@protocol HelloProtocol <NSObject>//默认就是required;
@required
- (void)requiredMethod;@optional
- (void)optionalMethod;@end

新建Person类,在Person.h中引入协议,如下:

#import <Foundation/Foundation.h>
#import "HelloProtocol.h"@interface Person : NSObject<HelloProtocol>@end

Person.m如下:

#import "Person.h"@implementation Person- (void)requiredMethod{NSLog(@"requiredMethod——必须实现的方法");
}- (void)optionalMethod{NSLog(@"optionalMethod——选择实现的方法");
}@end

之后在main.m中创建Person的对象去调用这些方法:

#import <Foundation/Foundation.h>
#import "Person.h"int main(int argc, const char * argv[]) {@autoreleasepool {Person *jack = [[Person alloc] init];[jack requiredMethod];[jack optionalMethod];}return 0;
}

例子很简单,这里不做过多讲解~

原创文章,转载请注明: 转载自李峰峰博客

本文链接地址: iOS Protocol详解

iOS Protocol 详解相关推荐

  1. IOS UIView详解

    文章目录 IOS UIView详解 1.官方类分析 2. UIView 常用的属性 2.1 UIView的圆角加阴影效果的实现 2.2 UIView 属性 2.2.1 UIView 几何属性 2.2. ...

  2. FreeEIM 来点新知识iOS UIScrollView详解

     老程序员FreeEIM 来点新知识iOS UIScrollView详解 UIScrollView 顾名思义也知道这个是和滚动相关的控件,在Android开发时遇到过ScrollView,当内容的 ...

  3. iOS绘图详解-多种绘图方式、裁剪、滤镜、移动、CTM

    iOS绘图详解 摘要: Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎.它提供了低级别.轻量级.高保真度的2D渲染.该框架可以用于基于路径的 绘 ...

  4. iOS疯狂详解之AFNetworking图片缓存问题

    AFNetworking网络库已经提供了很好的图片缓存机制,效率是比较高的,但是我发现没有直接提供清除缓存的功能,可项目通常都需要添加 清除功能的功能,因此,在这里我以UIImageView+AFNe ...

  5. iOS多线程详解:实践篇

    iOS多线程实践中,常用的就是子线程执行耗时操作,然后回到主线程刷新UI.在iOS中每个进程启动后都会建立一个主线程(UI线程),这个线程是其他线程的父线程.由于在iOS中除了主线程,其他子线程是独立 ...

  6. iOS疯狂详解之开源库

    youtube下载神器:https://github.com/rg3/youtube-dl vim插件:https://github.com/Valloric/YouCompleteMe vim插件配 ...

  7. [iOS] 国际化详解

    PS:修改设备系统语言方法 设置 -> 通用 -> 语言与地区 -> iPhone 语言 Settings -> General -> Language & Re ...

  8. iOS模式详解runtime面试工作

    简书:http://www.jianshu.com/p/19f280afcb24 对于从事 iOS 开发人员来说,所有的人都会答出「runtime 是运行时」,什么情况下用runtime?,大部分人能 ...

  9. UE4 IOS打包详解

    写在前面:因为是详解,所以可能写的有可能啰嗦,也有可能有些步骤是你经历过的,那么请忽略它,向下寻找可能的答案,如果没能解决你的问题,那么对此感到很抱歉,没能帮到你,欢迎你给我邮件: bluecode6 ...

  10. ios pods 详解

    CocoaPods详解之----使用篇 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/18737437 转载请注明出处 ...

最新文章

  1. Python语言学习:利用pandas对两列字段元素求差集(对比两列字段所有元素的异同)
  2. break和continue-continue代码演练
  3. ntext在mysql_varchar和text说不清的那些事
  4. 《vue2.0基础系列》目录大全,你要的都在这里
  5. 3109. [CQOI2013]新数独【DFS】
  6. Python标准库zlib提供的数据压缩功能
  7. 年近30,我的职业回顾与思考
  8. EDA技术实用教程VHDL篇--名词释义
  9. 【PX4自动驾驶用户指南】距离传感器
  10. 来自30岁女程序员的自我唤醒
  11. html打气球游戏,打气球.html
  12. 计算机杀毒有什么好处,电脑杀毒哪个最好?电脑杀毒的选择和使用
  13. GoodSync(最好的文件同步软件)
  14. python的培训学校
  15. 【自学编程】C语言编程简单的小程序,计算长方体体积!
  16. 从高德地图获取行政区域数据
  17. js 正则替换隐藏部分身份证或手机号以及隐藏部分名字
  18. Allegro中封装库中的封装更新到PCB中出现焊盘中心错位
  19. linux下exit()与_exit()的区别
  20. Android编写界面交互代码,android仿音悦台页面交互效果实例代码

热门文章

  1. 俄罗斯计算机水平_从四点到三十二点。 俄罗斯计算机和网络的早期
  2. 这名程序猿吐了一管口水,便迎来了人生的四大暴击…
  3. python 方差_python+方差_python 方差_python 方差齐性检验 - 云+社区 - 腾讯云
  4. 群体稳定度指标PSI
  5. [转][酷酷的滕]我爱你语录
  6. Python金融系列第七篇:市场风险
  7. 怎样打开t6系统服务器,t6客户端如何连接服务器
  8. D. Berserk And Fireball
  9. 【原创】小时候特别喜欢玩的强手棋游戏
  10. python输入个人所得税计算_python实例个税计算