协议 protocol

协议声明类需要实现的的方法,为不同的类提供公用方法,一个类可以有多个协议,但只能有一个父类,即单继承。它类似java中的接口。

正式协议(formal protocol)
------------------------------------------------------------------------------------
声明正式协议使用@protocol指令,以@end结尾。
@protocol MyXMLSupport
- initFromXMLRepresentation:(NSXMLElement *)XMLElement;
- (NSXMLElement *)XMLRepresentation;
@end
可以在协议声明中使用@optional和@required指令来指定协议中的方法是否必须要实现。如果没有为方法指定任何指令,@required是协议中默认的指令。
@protocol MyProtocol
- (void)requiredMethod;
@optional
- (void)anOptionalMethod;
- (void)anotherOptionalMethod;
@required
- (void)anotherRequiredMethod; 
@end

非正式协议(informal protocol)
------------------------------------------------------------------------------------
非正式协议通过分类(category)来实现,不过在Mac OS X v10.6+中可以在协议中通过@optional指令来取代这个别扭的方案。
@interface NSObject ( MyXMLSupport )
- initFromXMLRepresentation:(NSXMLElement *)XMLElement;
- (NSXMLElement *)XMLRepresentation;
@end

协议对象(protocol objects)
------------------------------------------------------------------------------------
Objective C中定义了协议对象,通过@protocol指令可以获取protocol实例。
Protocol *myXMLSupportProtocol = @protocol(MyXMLSupport);
当类采用(adopt)接口或在代码中通过@protocol(XX)指令时,编译器会创建protocol实例。

协议的使用
------------------------------------------------------------------------------------
协议的采用(adopt)和声明父类类似,可以在父类后面用尖括号将要采用的协议括起来,多个协议用逗号(comma)隔开。
类和分类都可以采用协议。
@interface ClassName : ItsSuperclass < protocol list >
@interface ClassName ( CategoryName ) < protocol list >
在接口部分不需要重新声明协议中的方法。但在类的实现部分需要实现协议中的@required方法。

是否遵循某协议
------------------------------------------------------------------------------------
检查一个类或实例对象是否遵循某协议可以用NSObject类的类方法conformsToProtocol和实例方法conformsToProtocol
if ( ! [receiver conformsToProtocol:@protocol(MyXMLSupport)]  ) {
    // Object does not conform to MyXMLSupport protocol
    // If you are expecting receiver to implement methods declared in the
    //  MyXMLSupport protocol, this is probably an error
}

使用协议进行类型声明
------------------------------------------------------------------------------------
声明对象类型时可以在声明中指定协议,这样可以让编译器在编译阶段强制对象遵循某协议。
- (id <Formatting>)formattingService;
id <MyXMLSupport> anObject;

协议的继承
------------------------------------------------------------------------------------
协议也可以继承或采用其他的协议,需要采用某协议的类必须实现该协议的required方法和该协议继承的协议中的required方法。
@protocol ProtocolName < protocol list >

在协议中使用其它的协议
------------------------------------------------------------------------------------
在一个大型的应用中,你可能会遇到如下代码:
#import "B.h"
@protocol A
- foo:(id <B>)anObject;
@end

#import "A.h"
@protocol B
- bar:(id <A>)anObject;
@end

A、B协议在互相引用,如果这里都用import来引入协议文件,编译器会报错。需要改为如下方式:
@protocol B;
@protocol A
- foo:(id <B>)anObject;
@end
@protocol B只是简单告诉编译器B是一个协议,不会引入B的文件。

时间: 2024-10-02 14:30:08

协议 protocol的相关文章

协议Protocol

1.协议:是一组声明方法的集合,不能声明成员变量,作用类似于接口. 遵守此协议的类就相当于拥有了这个协议的所有方法的声明,如果父类遵守了某个协议,子类也遵守了这个协议. 遵守这个协议的类可以实现协议中的方法. 关键字: @required:声明必须遵守的方法 @optional:声明可选的方法 2.代理:实现协议的某个方法 3.委托:指定要实现协议方法的对象(代理),代理来实现对应的方法 总结: 委托方:1.定义协议:2.引用代理:3.发送消息 代理方:1.遵守协议:2.实现方法:3.设置自己为

协议protocol和代理delegate的使用

这里的协议是独立的,不再类里面,所以每个类的头文件都要引入#import "MarryProtoco.h"头文件.. 首先新建一个协议 Protocol:MarryProtoco 里面写代理人要执行的方法,或者可选方法 #import <Foundation/Foundation.h> @protocol MarryProtoco <NSObject> //代理人中必须要执行的 . //做饭 - (void)cook; //洗衣服 - (void)washClo

类目 (category),扩展(Extension)和协议(protocol) (转)

@类目-分类(category) 1.类目: 类目(也成类别:Category)是一种为现有类添加新方法的方式2.类目的局限性:1)类目无法向已有的类中添加实例变量: 2)如果类目中的方法和已有类中的方法名称冲突时,类目中的方法优先级高,发生这种情况,则已有类的原始方法永无天日,最好的办法是将自己扩展的方法和原始方法区分开来. 3.类目的作用:?       将类的实现分散到多个不同的文件中–      将多个类目的声明放入同一个.h文件中–      将实现放入多个.m方法中?       使

协议(Protocol)与委托代理(Delegate)

协议(Protocol)的作用: 1. 规范接口,用来定义一套公用的接口: 2. 约束或筛选对象. 代理(Delegate): 它本身是一种设计模式,委托一个对象<遵守协议>去做某件事情,目的是为了降低对象间的耦合度:或用来逆向传值. 一.定义一套公用接口 1 /** 协议 */ 2 @protocol ExecuteProtocol <NSObject> 3 4 @required 5 /** 6 * @brief 必须实现的某个方法 7 */ 8 - (NSUInteger)q

关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol

关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol 2014-02-18 19:57 315人阅读 评论(0) 收藏 举报 1.category,覆盖原类的方法,即使不引用该category头文件,也能覆盖,respondsToSelector:方法也能响应.2.category,不可以有私有变量,但是可以有@property的声明,property的声明只是声明了该类的set,get方法(需要引用该category的头文件),但是categ

Objective-C中的协议(Protocol)和类别(Category)

1.什么是协议? 2.协议与类别的声明和使用 1.什么是协议? 在Objective-C中,不支持多继承,即不允许一个类有多个父类,但是OC提供了类似的实现方法,也就是协议.协议有点类似于Java里的接口,不同点就是在协议里,可以提供可选的方法,不要求全部继承. 协议包括正式协议和非正式协议. 正式协议:其声明一个方法列表,协议的实现者需要实现声明的方法,可以使用@required和@optional关键字指定方法必须实现或可选实现,默认为必须实现.子类会继承其父类采用的协议,一个协议本身也可以

swift协议_010-swift协议protocol

//: Playground - noun: a place where people can play import UIKit //-----协议-------// //协议:声明一组属性和方法,由协议的签订者来实现协议方法. //1.协议的声明 protocol WXHLProtocol { //声明一组方法 func doHomework() func dontLate() //3.Swift的协议中可以声明属性 var money : Int {set get} var classNu

12-Objective-C特有语法:协议protocol

1.协议是用来干嘛的? 用来声明一堆方法(不能声明成员变量) 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明 只要父类遵守了某个协议,就相当于子类也遵守那个协议 2.协议的定义 @protocol 协议名称 <NSObject> // 方法声明列表.... @end 3.如何遵守协议 1> 类遵守协议 @interface 类名 : 父类名 <协议名称1, 协议名称2> ······ @end 2> 协议遵守协议 @protocol 协议名称 <其

【OC基础】02-分类(Category)和协议(Protocol)

一.分类(Category) (1).分类的基础知识 分类是在不改变原有类内容的基础上,为类增加一些方法的方式. (2).分类的注意事项 1>分类只能增加方法,不能增加成员变量; 2>在分类方法的实现中可以访问原来类中的成员变量: 3>分类中可以重新实现原来类中的方法,但是这样会导致原来的方法无法在使用 4>在大规模应用中.通常把相应的功能写成分类,对原有的类进行扩充,一般分模块写,一个模块一个分类 二.分类的实现 我们可以再上一节Student类的基础上增加分类: CateStu

Objective-C 13 协议protocol

Objective-C中的协议@protocol,与java中的接口interface类似,其中列出的方法,本类不需要实现,而由实现此协议的类来实现这些方法. 1 声明协议protocol 格式: @protocol 协议名 ....方法 @end 两种方法: 1直接在某个类中声明.例如:协议NSObject是在NSObject.h文件中声明. @protocol NSObject - (BOOL)isEqual:(id)object; @property (readonly) NSUInteg