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


最新文章

  1. truncate的用法
  2. 反射 reflect 初始学习
  3. 重构oceanbase的一个函数
  4. Maven 学习笔记
  5. 201521123056 《Java程序设计》第13周学习总结
  6. mysql步骤详解
  7. 【mp3】洗脑循环了!龙珠超 自在极意功 【究极の圣戦】串田アキラ 背景纯音乐
  8. 通过地址获得经纬度(百度Geocoding API)
  9. 一个毕生难忘的BUG
  10. Linux网络配置(仅主机模式)
  11. netty源码分析之揭开reactor线程的面纱(二)
  12. pwn易忘操作原理笔记
  13. VIM+ctags+cscope
  14. table中强制不换行
  15. android studio常用控件
  16. 【BZOJ1051】[HAOI2006]受欢迎的牛
  17. VNC Server (Ubuntu 16.04.3 GNOME)
  18. JS事件常用事件
  19. Django——ContentType(与多个表建立外键关系)及ContentType-signals的使用
  20. MSDN版、OEM版、RTM版、VOL版等的区别

热门文章

  1. Unity判断网络连接类型
  2. Hadoop入门进阶步步高(五)-搭建Hadoop集群
  3. Shuttle ESB(四)——宣布订阅模式实例介绍(1)
  4. 使用WebBrowser,内存一直增加的解决办法
  5. rhel6使用的版本数部分intel xeon处理器时间bug
  6. SPPS java 创template
  7. 【Leetcode】Partition List (Swap)
  8. hdoj 2183 奇数阶魔方(II) 【模拟】+【法】
  9. LeetCode: Palindrome Partitioning [131]
  10. 介绍4种HTML5 Canvas库