protocol——协议

协议是用来定义对象的属性,行为和用于回调的。

    协议中有两个keyword@private和@optional,@private表示使用这个协议必需要写的方法,@optional表示可选的方法,用不到能够不写。


就像UITableView,它有两个协议:UITableViewDelegate和UITableViewDataSource,UITableViewDelegate是规定行为操作的,里面的方法都是可选的方
法,UITableViewDataSource是规定数据存储结构的,有两个必选方法。因此你再实现UITableViewDataSource时必需要定义这两个方法,否则程序会出错。

假设你使用了响应的类或者控件,假设该类定义了协议,就能够依据须要实现该协议。



protocol和java里interface的概念类似,是Objective-C语法的一部分。
定义protocol例如以下
@protocol ClassADelegate

- (void)methodA;
- (void)methodB; @end

那么就是定义了一组函数,这组函数放在一起叫作一个protocol,也就是协议。

函数是须要被实现的,所以假设对于class例如以下

@interface ClassB <ClassADelegate> {
}
@end

就叫作ClassB conform to protocol ClassADelegate,也就是说ClassB实现了这个协议,
也就是实现了这一组函数。

有了上面这个头文件,我们就能够放心作调用

ClassB *b = [[ClassB alloc] init];
[b methodA];
[b methodB];

而不用操心出现unrecognized selector sent to instance这样的错误了。

所以protocol就是一组函数定义,是从类声明中剥离出来的一组定义。

id<ClassADelegate> b = ...;
[b methodA];

这样的使用方法也常见,b是一个id类型,它知道ClassADelegate这组函数的实现。

delegate——托付,代理

适用场合:
类A调用类B, 当类B想回调类A的方法的时候, 要用到delegate
要理解以下的代码的话, 要知道的一个知识点是 协议(protocal)

文件:ClassA.h
#import <Foundation/Foundation.h>
#import "ClassB.h"
@interface ClassA : NSObject<SampleProtocal>
- (void)test;
@end 文件:ClassA.m
#import "ClassA.h"
@implementation ClassA -(void)test{
    ClassB *classB = [[ClassB alloc] init];
    classB.delegate = self;
    
    [classB actionOfClassB];
} -(void)callback{
    NSLog(@"这种方法会被类B调用");
}
@end 文件:ClassB.h
#import <Foundation/Foundation.h> @protocol SampleProtocal <NSObject>
@required
- (void)callback;
@end @interface ClassB : NSObject{
    id<SampleProtocal> delegate;
}
@property (nonatomic, retain) id<SampleProtocal> delegate; - (void)actionOfClassB; @end 文件:ClassB.m
#import "ClassB.h" @implementation ClassB
@synthesize delegate;
-(void)actionOfClassB{
    [delegate callback];
}
@end


iOS开发之protocol和delegate的更多相关文章

  1. iOS开发之UIApplication和delegate

    1.概述 所有的移动操作系统都有个致命的缺点:app很容易受到打扰.比如一个来电或者锁屏会导致app进入后台甚至被终止. 还有很多其它类似的情况会导致app受到干扰,在app受到干扰时,会产生一些系统 ...

  2. iOS 开发之 protocol Buffer 数据交换

    前言: 从 14 年公司做项目时开始接触 Google 的 protocol Buffer,用了一段时间,后来到新公司就没有机会再使用了,趁着还没完全忘记,记录下. 简介:protocolbuffer ...

  3. 李洪强iOS开发之Block和协议

    李洪强iOS开发之Block和协议 OC语言BLOCK和协议 一.BOLCK (一)简介 BLOCK是什么?苹果推荐的类型,效率高,在运行中保存代码.用来封装和保存代码,有点像函数,BLOCK可以在任 ...

  4. IOS开发之ZBarReaderView的使用

    IOS开发之ZBarReaderView的使用 HOMEABOUTGUESTBOOKCATEGORIESTAGSLINKSSUBSCRIBE 当开发IOS程序中需要用到二维码识别功能的时候,zbar这 ...

  5. iOS开发之Socket通信实战--Request请求数据包编码模块

    实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...

  6. iOS开发之UISearchBar初探

    iOS开发之UISearchBar初探 UISearchBar也是iOS开发常用控件之一,点进去看看里面的属性barStyle.text.placeholder等等.但是这些属性显然不足矣满足我们的开 ...

  7. iOS开发之UIImage等比缩放

    iOS开发之UIImage等比缩放 评论功能真不错 评论开通后,果然有很多人吐槽.谢谢大家的支持和关爱,如果有做的不到的地方,还请海涵.毕竟我一个人的力量是有限的,我会尽自己最大的努力大家准备一些干货 ...

  8. iOS开发之 Xcode6 添加xib文件,去掉storyboard的hello world应用

    iOS开发之  Xcode6.1创建仅xib文件,无storyboard的hello world应用 由于Xcode6之后,默认创建storyboard而非xib文件,而作为初学,了解xib的加载原理 ...

  9. iOS开发之loadView、viewDidLoad及viewDidUnload的关系

    iOS开发之loadView.viewDidLoad及viewDidUnload的关系 iOS开发之loadView.viewDidLoad及viewDidUnload的关系    标题中所说的3个方 ...

随机推荐

  1. C# DataTable详细用法

    通过经常使用的项目中的DataTable,假设DataTable使用得当,不仅能使程序简洁有用,并且可以提高性能,达到事半功倍的效果,现对DataTable的使用技巧进行一下总结. 一.DataTab ...

  2. 因host命令导致无法正常SHUTDOWN的实验

    SHUTDOWN有几个參数能够使用: SHUTDOWN NORMAL:NORMAL也是默认的子句,运行的条件是 No new connections are allowed after the sta ...

  3. 解决ASP.NET Web API Json对象循环参考错误

    前言 一般我们在开法 ASP.NET Web API 时,如果是使用 Entity Framework 技术来操作数据库的话,当两个 Entity 之间包含导览属性(Navigation Proper ...

  4. Apache 2.4虚拟主机配置

    托管它指的是多个站点的执行一台机器上 (例如 company1.example.com 和 company2.example.com) . 机能够"基于 IP",即每一个 IP 一 ...

  5. Python 获取Twitter用户与Friends和Followers的关系(eg, 交集,差集)

    CODE: #!/usr/bin/python # -*- coding: utf-8 -*- ''' Created on 2014-7-30 @author: guaguastd @name: f ...

  6. POJ2195 Going Home 【最小费用流】+【最佳匹配图二部】

    Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18169   Accepted: 9268 Descr ...

  7. 在cocos2d-x在CCTableView使用控制

    头文件需要继承CCTableViewDataSource和CCTableViewDelegate //CCScrollViewDelegate virtual void scrollViewDidSc ...

  8. UVa 699 落叶

    意甲冠军:我几乎不记得的题意!.! 它是一个长坑..我们从根节点开始,留下每一步,保存横坐标1,正确的一步加上横坐标1. 那么同样的横坐标统计data值总和. 思维:我来想,这可以递归成就.上就能够算 ...

  9. React的React Native

    React的React Native React无疑是今年最火的前端框架,github上的star直逼30,000,基于React的React Native的star也直逼20,000.有了React ...

  10. Linux进程的状态转换图

    http://blog.csdn.net/mu0206mu/article/details/7348618 ◆运行状态(TASK_RUNNING) 当进程正在被CPU执行,或已经准备就绪随时可由调度程 ...