协议

Posted 这波lucio来全学了

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了协议相关的知识,希望对你有一定的参考价值。

第13章 协议

13.1 正式协议

与非正式协议一样,正式协议包含了方法和属性的有名称列表。
不同的是,正式协议要求显式地采用(在@interface声明中列出协议的名称)
采用协议之后,类就要遵守该协议,实现该协议的所有方法

13.1.1 声明协议

@protocol NSCopying
  -(id) copyWithZone:(NSZone *) zone;
@end

继承父协议

@protocol MySuperDuberProtocol <MyparentProtocol>
-(void)....//需要实现的方法
@end

通常可以使用NSObject作为根协议(不要将其与NSObject类混淆)NSObject类复合NSObject协议,这意味着所有的对象都符合NSObject协议

13.1.2 采用协议

@interface Car:NSObject<NSCopying,NSCoding>

// instance variables

//methods
@end //Car

13.2 协议和数据类型

可以在数据类型中为实例变量和方法参数制定协议名称,有助于检查代码中的错误。

-(void)setObjectValue:(id<NSCopying>)object;

编译器将知道setObjectValue:接受任意类型的对象作为参数,但前提是要遵守该协议。否则会发生告警。

13.3 Objective-C 2.0 的新特性

@optional
-(void)...//不一定要实现
@required
-(void)...//一定要实现

非正式协议已经被替换成带有@optional方法的正式协议。

13.4 委托方法

委托(delegation)是一个经常与协议共用的特性。委托就是某个对象指定另一个对象处理某些特定任务的设计模式。

使用委托来执行相应方法时,代码首先询问委托是否拥有这个方法的实现,如果实现了,它就会要求委托处理这个方法。

示例
A.h
@protocol Mydelegate//协议的声明
-(void)Fun;
@end

@interface A:NSObject

   id<Mydelegate> delegate;//声明一个委托对象,我们要把事情委托给实现Mydelegate协议的类

@property(assign,nonatomic) id<Mydelegate> delegate;
@end
A.m
@implementation
-(void)init

    delegate = B;


-(void)FunToOther

    [delegate Fun];//将消息发送给委托去处理

@end
委托对象的实现
B.h
#import"A.h"
@interface B:NSObject<MyDelegate>
@end
B.m
@implementation
-(void)fun

    //实现Mydelegate中制定的方法

@end

以上是关于协议的主要内容,如果未能解决你的问题,请参考以下文章

一个网页从输入URL到页面加载完成的过程中都发生了什么事情?

一个页面从输入 URL 到页面加载完的过程中都发生了什么事情?

集中式日志系统 ELK 协议栈详解

集中式日志系统 ELK 协议栈详解

http协议

当你在浏览器输入网址后,回车后发生了什么