在OC程序中经常会有这样的问题就是一个类想让其他类帮自己实现某些方法,然后再将结果返回给这个类;如何让一个类要找的代理去实现自己想要的方法呢?

这样就需要有一个协议,让能遵守协议的其他类都能实现协议中的方法声明,成为该类的代理。

protocol的使用原则

1.可以用来声明很多方法,但是不能声明成员变量。

2.只要一个类遵守了这个协议,就相当于拥有了这个协议中所有的方法声明,然后在自己的.m文件中实现就行了。

3.只要父类遵守了这个协议,就相当于子类也遵守了这个协议。

protocol的使用方法:

一、协议的定义

@protocol  协议名<NSObject>

//方法声明

@end

二、如何遵守协议

1.类遵守协议

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

@end

2.协议遵守协议

@protocol 协议名 <协议1,协议2,……>

@end

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

1.@required(默认),这个是默认要求去实现的,不实现会有警告。

2.@optional这个是可以先实现也可以选择不实现。

一般情况下这两个关键字是用于程序员之间的交流,声明哪些方法可以不实现哪些方法要去实现。

四、在定义一个变量时,可以限制这个变量保存的对象遵守某个协议

类名<协议名>*变量名;       如Person<protocol1>*p=[[Person alloc]init];   要求p保存的对象Person必须遵守protocol1协议。

id<协议名>变量名;            如id<protocol1>obj;

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

@property (nonatomic ,strong) 类名<协议名>变量名;         如@property (nonatomic,strong) Person<protocol1>*p1;

六、协议不仅可以定义在单独的.h文件中也可以定义在一个类的声明中。

即若协议内容公用就要定义在单独的.h文件中方便使用。

七、协议的提前声明

和类的提前声明“@class 类名”的方式类似,协议的提前声明可以用“@protocol 协议名”的方式进行提前声明,些声明只是纯粹性的声明,若需要协议中的方法还需要用

#import "协议头文件"方式获取其中的方法声明。

如:@protocol Myprotocol;          #import "Myprotocol.h"

关于protocol 理论知道我只学了这么多,日后的学习中再进行补充吧。

http://www.itheima.com/

黑马程序员——有关protocol的小结的更多相关文章

  1. 黑马程序员——有关protocol代理模式的举例说明

    学习了protocol协议的基本原理和使用方法之后 ,下面就看一下在程序中是怎么体现这种代理思想的. 假定有个人jack需要找一个厨师为自己做饭,当他想要吃饭的时候就可以让厨师给他做好饭.这一需求如何 ...

  2. 黑马程序员——【Java高新技术】——代理

    ---------- android培训.java培训.期待与您交流! ---------- 一.“代理概述”及“AOP概念” (一)代理概述 1.问题:要为已存在的多个具有相同接口的目标类的各个方法 ...

  3. 黑马程序员+SQL基础(上)

    黑马程序员+SQL基础 ---------------<a href="http://edu.csdn.net"target="blank">ASP ...

  4. 黑马程序员+Winform基础(上)

    黑马程序员+Winform基础 ---------------<a href="http://edu.csdn.net"target="blank"> ...

  5. 黑马程序员—C语言的函数、数组、字符串

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.函数 定义:函数是代码复用的一种机制. 函数的基本语法: 返回类型 函数名 ( 参数类型 参 ...

  6. 黑马程序员:Java基础总结----泛型(高级)

    黑马程序员:Java基础总结 泛型(高级)   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 泛型(高级) 泛型是提供给javac编译器使用的,可以限定集合中的输入类型 ...

  7. 黑马程序员:Java基础总结----类加载器

    黑马程序员:Java基础总结 类加载器   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个 ...

  8. 黑马程序员:Java基础总结----静态代理模式&动态代理

    黑马程序员:Java基础总结 静态代理模式&动态代理   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 静态代理模式 public  class  Ts {   ...

  9. 黑马程序员:Java基础总结----枚举

    黑马程序员:Java基础总结 枚举   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 枚举 为什么要有枚举 问题:要定义星期几或性别的变量,该怎么定义?假设用1-7分别 ...

随机推荐

  1. c# 将字符串转换为逻辑表达式(字符串转换布尔)

    比如:string str="6>5"; 要的效果是:bool result=6>5 方案一: 命名空间:System.Data: DataTable dt = new ...

  2. IOS 改变导航栏返回按钮的标题

    IOS 改变导航栏返回按钮的标题   下午又找到了一个新的方法 这个方法不错 暂时没有发现异常的地方. 新写的App中需要使用UINavigationController对各个页面进行导航,但由于第一 ...

  3. ActiveXObject Word.Application 打印小票

    javascript 时间格式 Date.prototype.format = function (format) { var o = { "M+": this.getMonth( ...

  4. Ubuntu下搭建java开发环境

    JDK安装: 1. 在http://www.oracle.com/technetwork/java/javase/downloads/index.html上下载相应版本的JDK环境,这里我使用的是jd ...

  5. ios用户控件

    22:48:452015-03-16说道用控件,很地东方都在用.用好了,可以加快开发进度,提高可维护性,程序的稳定,健壮性,用不好,也可以提高经验值啊,下次就好了,算是学习成本吧. 不同语言,不同项目 ...

  6. Android HTTPS(1)概念和简单示例

    Security with HTTPS and SSL The Secure Sockets Layer (SSL)—now technically known as Transport Layer ...

  7. vm上安装ubuntu

    图解演示环境版本: 本机系统: WIN7 虚拟机:VMware Workstation 8 (英文版) 安装目标:Ubuntu Desktop 12.04 LTS  (请点击这里)先下载好iso镜像文 ...

  8. 第四讲:hibernate 的session (二)

    Session在hibernate中表示连接.下面介绍他的常用方法. 在使用前先把最重要的说了.打开API,发现在session中基本所有的方法(包括获得session的方法)都会抛出异常Hibern ...

  9. 多线程安全的HTTPCLIENT

    private static HttpClient httpClient;     static {           HttpParams params = new BasicHttpParams ...

  10. 函数lock_rec_create

    /*********************************************************************//** Creates a new record lock ...