iOS Protocol 详解
一、概述
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 详解相关推荐
- IOS UIView详解
文章目录 IOS UIView详解 1.官方类分析 2. UIView 常用的属性 2.1 UIView的圆角加阴影效果的实现 2.2 UIView 属性 2.2.1 UIView 几何属性 2.2. ...
- FreeEIM 来点新知识iOS UIScrollView详解
老程序员FreeEIM 来点新知识iOS UIScrollView详解 UIScrollView 顾名思义也知道这个是和滚动相关的控件,在Android开发时遇到过ScrollView,当内容的 ...
- iOS绘图详解-多种绘图方式、裁剪、滤镜、移动、CTM
iOS绘图详解 摘要: Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎.它提供了低级别.轻量级.高保真度的2D渲染.该框架可以用于基于路径的 绘 ...
- iOS疯狂详解之AFNetworking图片缓存问题
AFNetworking网络库已经提供了很好的图片缓存机制,效率是比较高的,但是我发现没有直接提供清除缓存的功能,可项目通常都需要添加 清除功能的功能,因此,在这里我以UIImageView+AFNe ...
- iOS多线程详解:实践篇
iOS多线程实践中,常用的就是子线程执行耗时操作,然后回到主线程刷新UI.在iOS中每个进程启动后都会建立一个主线程(UI线程),这个线程是其他线程的父线程.由于在iOS中除了主线程,其他子线程是独立 ...
- iOS疯狂详解之开源库
youtube下载神器:https://github.com/rg3/youtube-dl vim插件:https://github.com/Valloric/YouCompleteMe vim插件配 ...
- [iOS] 国际化详解
PS:修改设备系统语言方法 设置 -> 通用 -> 语言与地区 -> iPhone 语言 Settings -> General -> Language & Re ...
- iOS模式详解runtime面试工作
简书:http://www.jianshu.com/p/19f280afcb24 对于从事 iOS 开发人员来说,所有的人都会答出「runtime 是运行时」,什么情况下用runtime?,大部分人能 ...
- UE4 IOS打包详解
写在前面:因为是详解,所以可能写的有可能啰嗦,也有可能有些步骤是你经历过的,那么请忽略它,向下寻找可能的答案,如果没能解决你的问题,那么对此感到很抱歉,没能帮到你,欢迎你给我邮件: bluecode6 ...
- ios pods 详解
CocoaPods详解之----使用篇 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/18737437 转载请注明出处 ...
最新文章
- Python语言学习:利用pandas对两列字段元素求差集(对比两列字段所有元素的异同)
- break和continue-continue代码演练
- ntext在mysql_varchar和text说不清的那些事
- 《vue2.0基础系列》目录大全,你要的都在这里
- 3109. [CQOI2013]新数独【DFS】
- Python标准库zlib提供的数据压缩功能
- 年近30,我的职业回顾与思考
- EDA技术实用教程VHDL篇--名词释义
- 【PX4自动驾驶用户指南】距离传感器
- 来自30岁女程序员的自我唤醒
- html打气球游戏,打气球.html
- 计算机杀毒有什么好处,电脑杀毒哪个最好?电脑杀毒的选择和使用
- GoodSync(最好的文件同步软件)
- python的培训学校
- 【自学编程】C语言编程简单的小程序,计算长方体体积!
- 从高德地图获取行政区域数据
- js 正则替换隐藏部分身份证或手机号以及隐藏部分名字
- Allegro中封装库中的封装更新到PCB中出现焊盘中心错位
- linux下exit()与_exit()的区别
- Android编写界面交互代码,android仿音悦台页面交互效果实例代码
热门文章
- 俄罗斯计算机水平_从四点到三十二点。 俄罗斯计算机和网络的早期
- 这名程序猿吐了一管口水,便迎来了人生的四大暴击…
- python 方差_python+方差_python 方差_python 方差齐性检验 - 云+社区 - 腾讯云
- 群体稳定度指标PSI
- [转][酷酷的滕]我爱你语录
- Python金融系列第七篇:市场风险
- 怎样打开t6系统服务器,t6客户端如何连接服务器
- D. Berserk And Fireball
- 【原创】小时候特别喜欢玩的强手棋游戏
- python输入个人所得税计算_python实例个税计算