Objective-C 委托、非正式协议、正式协议

一、概念:
1、委托(delegate,也叫代理):当一个对象接受到某个事件或者通知的时候,会向它的Delegate对象查询它是否能够响应这个事件或者通知,如果可以,这个对象就会给它的Delegate对象发送一个消息(执行一个方法调用)。在这种机制下,您可以不进行子类化和方法重载,而是将自己的定制代码放到委托对象中,从而避免对复杂对象进行修改。当您感兴趣的事件发生时,复杂对象会将消息发送给您定制的委托对象。您可以通过这种“挂钩”执行自己的定制代码,实现需要的行为。
2、非正式协议(informal protocol):使用类别category来实现,非正式协议是NSObject的一个类别,这样任何类的对象都可以作为委托对象来使用,它可以列出对象能够执行的所有方法,这样用来实现委托, 我们可以使用选择器来判断该非正式协议中是否有这个方法。
3、正式协议(formal protocol):是一个命名的方法列表,与非正式协议相比不同的是,它要求显示的采用协议,采用协议的方法是在类的@interface声明中列出协议的名称,此时,实现协议的类应该遵守协议,承诺实现协议中的所有方法,否则编译器将会发出警告。
正式协议协议类似于C++的纯虚函数,协议只有声明,没有实现,用来在子类中实现,协议中的方法有两类属性,@required(默认)和@optional两种,@required属性的要求实现协议的类必须要实现这种方法,而@optional属性的方法则不要求,如果不确定协议是否被实现,可以使用respondsToSelector:@select()来判断。

二、应用举例

源码如下:

/*********简单的委托举例************/

@interface A :NSObject

-(void)Log;

@end

@implementation A

-(void)Log{

NSLog(@"This is A Log");

}

@end

@interface B :NSObject{

A* delegate;

}

@property (nonatomic,retain)A* delegate;

-(void)callLog;

@end

@implementation B

@synthesize delegate;

-(id)init{

if (self = [superinit] ) {

delegate = [[Aalloc]init];

}

returnself;

}

-(void)callLog{

NSLog(@"This is B callLog");

[self.delegateLog];

}

@end

/*********简单的委托举例************/

/*********简单的正式协议举例************/

//协议--begain

@protocol myProtocol

//可选实现的

@optional

-(void)optional_print;

//要求实现的

@required

-(void)required_print;

@end

//协议--end

//使用协议的类--begain

@interface  myClass :NSObject<myProtocol>

-(void)print;

@end

@implementation myClass

-(void)print{

NSLog(@"This is myClass print");

}

//实现可选实现的协议

-(void)optional_print{

NSLog(@"This is protocol optional_print");

}

//实现必须实现的协议

-(void)required_print{

NSLog(@"This is protocol required_print");

}

@end

//使用协议的类--end

/*********简单的正式协议举例************/

/*********简单的非正式协议举例************/

@interface NSObject(myCategory)

-(void)informal_protocol_print;

@end

@implementation NSObject(myCategory)

-(void)informal_protocol_print{

NSLog(@"This is informal_protocol_print");

}

@end

/*********简单的非正式协议举例************/

/*********正式协议实现委托举例************/

//协议--begain

@protocol myProtocolEx

//可选实现的

@optional

-(void)optional_print;

//要求实现的

@required

-(void)required_print;

@end

//协议--end

@interface myClassEx :NSObject{

id<myProtocolEx> delegate;

}

@property (nonatomic,assign)id<myProtocolEx> delegate;

-(void)print;

@end

@implementation myClassEx

@synthesize delegate;

-(void)print{

NSLog(@"This is myClassEx print");

[self.delegateoptional_print];

[self.delegaterequired_print];

}

@end

@interface myCall :NSObject<myProtocol>{

myClassEx *cls;

}

@property (nonatomic,retain)myClassEx *cls;

-(void)callPrint;

@end

@implementation myCall

@synthesize cls;

-(id)init{

if (self=[superinit]) {

myClassEx* c = [[myClassExalloc]init];

self.cls = c;

cls.delegate = (id)self;

[crelease];

}

returnself;

}

-(void)callPrint{

NSLog(@"This is myCall callPrint");

[self.clsprint];

}

-(void)optional_print{

NSLog(@"This is myCall implemented formal protocol optional_print");

}

-(void)required_print{

NSLog(@"This is myCall implemented formal protocol required_print");

}

@end

/*********正式协议实现委托举例************/

int main(int argc,char *argv[])

{

@autoreleasepool {

//委托的使用

B* b = [[B alloc]init];

[bcallLog];

[b informal_protocol_print];//非正式协议的使用

NSLog(@"---------------------------------");

//协议的使用

myClass *cls = [[myClassalloc]init];

[clsprint];

[clsoptional_print];

[clsrequired_print];

[cls informal_protocol_print];//非正式协议的使用

NSLog(@"---------------------------------");

//正式协议实现委托的使用

myCall *call = [[myCallalloc]init];

[callcallPrint];

NSLog(@"---------------------------------");

return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

}

}

http://blog.csdn.net/jjunjoe/article/details/7846025

时间: 2024-11-01 11:28:24

Objective-C 委托、非正式协议、正式协议的相关文章

Object-C非正式协议与正式协议的区别

一.非正式协议 显然这个名词是相对于正式协议而言的.在解释非正式协议之前,先引用两段话: 1.在<Cocoa设计模式>第六章类别的6.3.2把类别用于非正式协议一节中,这样写到: 非正式协议通常定义为NSObject的类别.类别接口中指定的方法可能会或者可能不会被框架类实际地实现.非正式协议位于一种设计灰区中.正式协议由编译器检查并且代表一种关于对象能力的保证,但是非正式协议不会做出保证----而只会给出提示. 2.苹果官方文档Cocoa Core Competencies一文中是这样介绍非正

Objective-c 05 类别 类扩展 委托 非正式协议 协议 代码块 并发性 队列

类别 为已经存在的类添加行为时,通常采用创建子类的方法,不过有时子类并不方便, 比如:创建NSString的子类,但是NSString实际上只是一个类簇的表面形式.因而为这样的类创建子类会非常困难.在其他情况下, 也许可以创建它的子类,但是用到的工具集和库无法帮你处理新类的对象的.例如:当使用stringWithFormat:类方法生成新字符串时,你创建的 NSString类的新子类就无法返回.   利用Objective-C的动态运行时分配机制,可以为现有的类添加新的方法.这些新的方法在Obj

Object-C中的非正式协议与正式协议

之前对 "非正式协议"一词不甚理解,查阅一番后就自己的理解简单梳理一下, 下面是苹果官方文档Cocoa Core Competencies一文中对非正式协议的介绍: An informal protocol is a category on NSObject, which implicitly makes almost all objects adopters of the protocol. (A category is a language feature that enables

正式协议

正式协议的概念,可以通过在@protocol部分列出一组方法名来定义一个正式协议.通过在@interface声明中的类名之后列出用尖括号括起来的协议名称,对象可以采用该协议.当对象采用一个正式协议时,它承诺实现该协议中列出的每一个要求实现的方法.如果你没有实现协议中的所有方法,编译器将向你提出警告,从而帮助你旅行自己的承诺.

组件接口(API)设计指南[3]-委托(delegate)和数据源协议(data-source protocols)

*返回目录阅读其他章节: http://blog.csdn.net/cuibo1123/article/details/39894477 委托(delegate)和数据源协议(data-source protocols) 委托协议是一个非常好的设计,它能让你用简单灵活的方式去实现MVC模式,并能增强松散耦合以及养成良好的API设计习惯. 这里是MGTileMenu的委托协议. 我们几乎可以在任何组件中利用经典的委托(delegate)和数据源协议(data-source protocols).如

Zookeeper——一致性协议:Zab协议

Reference: https://www.jianshu.com/p/2bceacd60b8a 什么是Zab协议 Zab 协议的作用 Zab 协议原理 Zab 协议核心 Zab 协议内容 原子广播 崩溃恢复 如何保证数据一致性 Zab 协议如何数据同步 如何处理需要丢弃的 Proposal Zab 协议实现原理 选主过程 什么是Zab协议? Zab协议 的全称是 Zookeeper Atomic Broadcast (Zookeeper原子广播). Zookeeper 是通过 Zab 协议来

TCP/IP协议,HTTP协议

1. 协议  a. TCP/IP总体构架概述     TCP/IP协议并不全然符合OSI的七层參考模型.传统的开放式系统互连參考模型,是一种通信协议的7层抽象的參考模型,当中每一层运行某一特定任务.该模型的目的是使各种硬件在同样的层次上相互通信.这7层是:物理层.数据链路层.网路层.传输层.话路层.表示层和应用层.而TCP/IP通讯协议採用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完毕自己的需求.这4层分别为:     i.   应用层:应用程序间沟通的层,如超文本传送协议(HTTP

TCP/IP协议-IP协议

A contented mind is a perpetual feast. "知足长乐" 参考资料:TCP/IP入门经典 (第五版) TCP/IP详解 卷一:协议 一.简介 IP协议(Internet协议,网际协议),是TCP/IP协议族中最核心的协议,位于协议栈的网络层 既然位于网络层,所以IP协议最主要的功能就是 提供独立于硬件的逻辑寻址 和 支持网间数据传递的路由选择,我们将在后面的部分介绍这两个功能,下面先来分析一下IP首部 二.IP首部 我们在 TCP/IP协议-入门 中说

网络七层协议/五层协议

将网络各个层面比喻成一次深情的告白: 应用层: 规定"应用程序"的数据格式. http / ftp /email 等.   //纸条上写的是啥? 传输层: 建立"端口"到"端口"之间的通信. UDP/TCP 协议."端口". //我们帮你传纸条 网络层: 确定每一台计算机的位置,建立"主机"到"主机"之间的通信.IPv4协议,"IP地址".   // 女孩的位置 数据