protocol 协议

protocol:用来声明方法

1.协议的定义

@protocol 协议名称 <NSObject>

// 方法声明列表....

@end

2.如何遵守协议

1> 类遵守协议

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

@end

2> 协议遵守协议

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

@end

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

1> @required (默认)

要求实现,如果没有实现,会发出警告

2> @optional

不要求实现,这样不会有警告

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

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

id<协议名称> 变量名;

NSObject<MyProtocol> *obj;

id<MyProtocol> obj2;

如果没有遵守对应的协议,编译器会警告

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

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

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

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

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

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

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

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

7.分类可用定义在单独.h和.m文件中,也可用定义在原来类中

1> 一般情况下,都是定义在单独文件

2> 定义在原来类中的分类,只要求能看懂语法

#import <Foundation/Foundation.h>

@protocol MyProtocol <NSObject> // 遵守其他协议,就把其他协议名写在间括号< >内

 // 默认需要实现
- (void)test; // 声明方法 // required 需要实现, 不实现只会发出警告
// optional 不需要实现
@required
- (void)test1;
- (void)test2; @optional
- (void)test3; @end /******以上是MyProtocol.h文件*******/ #import <Foundation/Foundation.h>
@protocol MyProtocol; // 可以同时有多个协议 <MtProtocol, MyProtocol2>
@interface Person : NSObject <MyProtocol>
@property (nonatomic, strong) id<MyProtocol> obj; @end
/******以上是Person.h文件*******/ #import <Foundation/Foundation.h>
#import "MyProtocol.h"
@inplementation Person - (void)test
{
}
- (void)test1
{
}
- (void)test2
{
} @end
/******以上是Person.m文件***********/ #import <Foundation/Foundation.h>
#import "MtProtocol.h"
#import "Person.h"
int main()
{   Person *p = [[Person alloc] init];
     return 0;
}

基协议:<NSObject>  默认遵守基协议

Objective-C( protocol协议)的更多相关文章

  1. Objective中的协议(Protocol)

    Objective中的协议(Protocol) 作用: 专门用来声明一大堆方法. (不能声明属性,也不能实现方法,只能用来写方法的声明). 只要某个类遵守了这个协议.就相当于拥有这个协议中的所有的方法 ...

  2. ISO 基础之 (十三) protocol 协议

    一 简绍 protocol,简单来说就是一系列不属于任何类的方法列表,其中声明的方法可以被任何类实现.这种模式一般称为代理(delegation)模式.通过Protocol定义各种行为,在不同的场景采 ...

  3. 【转】iOS开发-Protocol协议及委托代理(Delegate)传值

    原文网址:http://www.cnblogs.com/GarveyCalvin/p/4210828.html 前言:因为Object-C是不支持多继承的,所以很多时候都是用Protocol(协议)来 ...

  4. protocol(协议)

      可以用来声明一大堆方法(不能声明成员变量) 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明 只要父类遵守了某个协议,就相当于子类也遵守了   //定义一个名叫MyProtocol的 ...

  5. OC语法10——@protocol协议,

    参考资料:博客 @protocol,协议: OC中protocol的含义和Java中接口的含义是一样的,它们的作用都是为了定义一组方法规范. 实现此协议的类里的方法,必须按照此协议里定义的方法规范来. ...

  6. iOS开发-Protocol协议及委托代理(Delegate)传值

    前言:因为Object-C是不支持多继承的,所以很多时候都是用Protocol(协议)来代替.Protocol(协议)只能定义公用的一套接口,但不能提供具体的实现方法.也就是说,它只告诉你要做什么,但 ...

  7. Tabular DataStream protocol 协议

    Tabular DataStream protocol 协议 Freetds 创建过程 https://wenku.baidu.com/view/2076cbfaaef8941ea76e0576.ht ...

  8. DHCP (Dynamic Host Configuration Protocol )协议的探讨与分析

    DHCP (Dynamic Host Configuration Protocol )协议的探讨与分析 问题背景 最近在工作中遇到了连接外网的交换机在IPv6地址条件下从运营商自动获取的DNS地址与本 ...

  9. SIP (Session Initiation Protocol) 协议

    Session Initiation Protocol 介绍 SIP是VoIP技术最常使用的协议,它是一种应用程序层协议,可与其他应用程序层协议配合使用,以控制Internet上的多媒体通信会话. V ...

随机推荐

  1. 【Selenium】2.安装Selenium IDE和 FireBug

    本文供学习交流之用,没有商业用途,没有盈利. 完全是我自己为督促自己学习而翻译的.翻译的不好,见谅.来源于:http://www.guru99.com/install-selenuim-ide.htm ...

  2. IsBackground的理解

    1.当在主线程中创建了一个线程,那么该线程的IsBackground默认是设置为FALSE的. 2.当主线程退出的时候,IsBackground=FALSE的线程还会继续执行下去,直到线程执行结束. ...

  3. ipcs命令

    unix/linux下的共享内存.信号量.队列信息管理 在unix/linux下,经常有因为共享内存.信号量,队列等共享信息没有干净地清楚而引起一些问题. 查看共享信息的内存的命令是ipcs [-m| ...

  4. 探究platform_driver中的shutdown用途

    http://blog.csdn.net/moxiaomomo/article/details/7897943 "quiesce" 说的也不太明确,我的猜测是:比如系统中有一个大功 ...

  5. easylui datagrid 动态生成列

    function load(sdate) { $.getJSON("workorder/statistics.do", { sdate : sdate+'-01' }, funct ...

  6. SelectMany等LINQ运算符的使用

    public class Racer : IComparable<Racer>, IFormattable { public string FirstName { get; set; } ...

  7. code异常处理

    private void copyPrivateRawResuorceToPubliclyAccessibleFile() { InputStream inputStream = null; File ...

  8. [问题2014S05] 解答

    [问题2014S05] 解答  (本解答由谷嵘同学提供) 首先, 由 \(\mathrm{tr}(AB)=\mathrm{tr}(BA)\) 可得 \(a=0\), 或者由 Cauchy-Binet ...

  9. linux环境下安装mysql数据库遇到的问题

    总结一句话: 安装完mysql数据库记得授权远程登录.   坑的现象: ERROR 1045 (28000): Access denied for user 'guoxp'@'localhost' ( ...

  10. [issue] dyld`dyld_fatal_error: -> 0x120015088 <+0>: brk #0x3

    iOS "dyld`dyld_fatal_error: -> 0x12000d088 <+0>: brk #0x3"错误 根据上面的博客里的方法二 尝试解决方法二 ...