协议的作用类似地C++中对抽象基类的多重继承。类似于Java中的接口(interface)的概念。
  协议是多个类共享方法的列表,协议中列出的方法在本类中并没有相应实现,而是别的类来实现这些方法。

如果一个类要遵守一个协议,该类就必须实现特定协议的所有方法(可选方法除外).

定义一个协议需要使用@protocol指令,紧跟着的是协议名称,然后就可以声明一些方法,在指令@end之前的所有方法的声明都是协议的一部分。如下:

  1. @protocol NSCopying
  2. -(id) copyWithZone:(NSZone*) zone;
  3. @end

如果你的类决定遵守NSCopying协议,则必须实现copyWithZone方法。通过在@interface中的一对尖括号内列出协议的名称,告诉编译你正在遵守一个协议,比如:
@interface Test:NSObject <NSCopying>

实例:
Fly.h

  1. #import <Foundation/Foundation.h>
  2. @protocol Fly
  3. -(void) go;
  4. -(void) stop;
  5. @optional
  6. -(void)sleep;
  7. @end

FlyTest.h

  1. #import <Foundation/Foundation.h>
  2. #import "Fly.h"
  3. @interface FlyTest:NSObject<Fly> {
  4. }
  5. @end

FlyTest.m

  1. #import "FlyTest.h"
  2. @implementation FlyTest
  3. -(void) go {
  4. NSLog(@"go");
  5. }
  6. -(void) stop {
  7. NSLog(@"stop");
  8. }
  9. @end

test.m

  1. #import <Foundation/Foundation.h>
  2. #import "FlyTest.h"
  3. int main( int argc, char* argv[]){
  4. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
  5. FlyTest *flytest = [[FlyTest alloc]init];
  6. [flytest go];
  7. [flytest stop];
  8. [flytest release];
  9. [pool drain];
  10. return 0;
  11. }

程序运行结果如下:

go
stop

@protocol的标准语法是:
@protocol 协议名<其它协议, …>
  方法声明1
@optional
  方法声明2
@required
  方法声明3

@end

@optional表明该协议的类并不一定要实现方法。
@required是必须要实现的方法。

最新文章

  1. 在Linux虚拟机下配置tomcat
  2. JDBC中的Statement和PreparedStatement的区别
  3. ImageView学习
  4. Openbox简单支持平铺
  5. C#有关数组内存的释放及动态数组问题
  6. vs2015里给c#添加轮廓折叠功能
  7. 你应该知道的 RPC 原理
  8. 作业成绩 final-review 20161201-1203 15:05
  9. Codeforces Round #174 (Div. 1) B. Cow Program(dp + 记忆化)
  10. Codeforces Round #365 (Div. 2) B 前缀和
  11. python 正则表达式 demo
  12. [Oracle] 中的Temporary tablespace的作用
  13. C/C++:类模板
  14. 使用C#开发纽曼USB来电小秘书客户端小结
  15. javascript进阶——测试和打包分发
  16. Android 开发笔记“程序安装包APK的制作”
  17. mysql-python 安装
  18. 2015 多校联赛 ——HDU5350(huffman)
  19. IBM SPSS 实习总结
  20. KVM内核文档阅读笔记

热门文章

  1. Hyper-v 安装CentOS
  2. 请求http服务
  3. This 关键字和变量作用域
  4. python一些模块的exe安装包在windows的64位系统里识别不到已安装Python目录的解决方法
  5. python读取word表格内容(1)
  6. CSS Flex
  7. oracle服务器和客户端字符集的查看和修改
  8. JqGrid使用经验
  9. [poj 3159]Candies[差分约束详解][朴素的考虑法]
  10. HDU1506 ( Largest Rectangle in a Histogram ) [dp]