ios—-protocol, optional ,delegate

ios—-protocol, optional ,delegate

ios—-protocol,delegate

 

 


protocol——协议

协议是用来定义对象的属性,行为和用于回调的。
协议中有两个关键字@private和@optional,@private表示使用这个协议必须要写的方法,@optional表示可选的方法,用不到可以不写。
就像UITableView,它有两个协议:UITableViewDelegate和UITableViewDataSource,UITableViewDelegate是规定行为操作的,里面的方法都是可选的方 法,UITableViewDataSource是规定数据存储结构的,有两个必选方法。因此你再实现UITableViewDataSource时必须要定义这两个方法,否则程序会出错。
如果你使用了响应的类或者控件,如果该类定义了协议,就可以根据需要实现该协议。

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

[cpp] view plaincopyprint?

1
2
3
4
5
6
@protocol ClassADelegate  

- (void)methodA;  
- (void)methodB;  

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

函数是需要被实现的,所以如果对于class如下
[cpp] view plaincopyprint?


@interface ClassB <ClassADelegate> {  
}  
@end  
就叫作ClassB conform to protocol ClassADelegate,也就是说ClassB实现了这个协议,
也就是实现了这一组函数。

有了上面这个头文件,我们就可以放心作调用
[cpp] view plaincopyprint?


ClassB *b = [[ClassB alloc] init];  
[b methodA];  
[b methodB];  
而不用担心出现unrecognized selector sent to instance这种错误了。

所以protocol就是一组函数定义,是从类声明中剥离出来的一组定义。
[cpp] view plaincopyprint?


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
摘自:http://blog.csdn.net/mars2639/article/details/7310182


摘自:
http://blog.csdn.net/mars2639/article/details/7310182

转载于:https://www.cnblogs.com/someonelikeyou/p/3541753.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100828.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Ubuntu18.04安装Anaconda+PyCharm+VS Code[通俗易懂]

    Ubuntu18.04安装Anaconda+PyCharm+VS Code[通俗易懂]PyCharm安装、桌面快捷方式建立及设置中文输入

    2022年8月28日
    0
  • Ubuntu18.04下安装Pytorch-GPU(超详细自己安装全过程)「建议收藏」

    Ubuntu18.04下安装Pytorch-GPU(超详细自己安装全过程)「建议收藏」硬件环境:自己的笔记本电脑CPU:i5-4210MGPU:NVIDIAgeforce920M1Anaconda3的安装与配置1.1下载可以到Anaconda官网下载历史版本:https://repo.anaconda.com/archive/国内的下载速度可能比较慢,选择到清华大学开源软件镜像站下载。我使用的python3.6.9,下载对于的Anaconda版本是5.1…

    2022年9月26日
    0
  • 【通俗易懂】关系模式范式分解教程 3NF与BCNF口诀!小白也能看懂「建议收藏」

    本来是为了复习数据库期末考试,结果找了一圈都没有发现比较好的解释,通过查阅资料和总结,为大家提供通俗易懂的解法,一听就会!并且配有速记口诀!介是你没有玩过的船新版本包含最小依赖集求法候选码求法在模式分解之前,首先对于1NF,2NF,3NF,BCNF做一个简明扼要的介绍。1NF是指数据库表的每一列都是不可分割的基本数据项,即实体中的某个属性不能有多个值或者不能有重复的属性。2NF要求属性…

    2022年4月8日
    83
  • 小米手机MIUI安装Google服务框架和Google Play的教程[通俗易懂]

    GooglePlay上的APP普遍比国内应用商店的要干净得多,权限要求更少,这也是促使很多人使用GooglePlay的原因。步骤如下:1、打开小米应用商店,搜索“谷歌安装器”,拉到最下面,“去豌豆荚搜索”image2、找到谷歌安装器3.0image3、开始安装Google服务框架和GooglePlayimage整个过程无需SS,在国内网络即可完成。最后,连上SS,登录GooglePlay,开始下载干净的app吧,少年。…

    2022年4月15日
    11.7K
  • Linux VI文本编辑器

    Linux VI文本编辑器VI文本编辑器  学会使用vi编辑器是学习Linux系统的必备技术之一,因为一般的Linux服务器是没有GUI界面的,Linux运维及开发人员基本上都是通过命令行的方式进行文本编辑或程序编写的。vi编辑器是Linux内置的文本编辑器,几乎所有的类unix系统中都内置了vi编辑器,而其它编辑器则不一定,另外很多软件会调用vi编辑进行内容编写,例如cront…

    2022年7月26日
    5
  • java 基础 代码 详解_java新手入门-java新手代码大全

    java 基础 代码 详解_java新手入门-java新手代码大全​java中有很多的知识非常的繁琐,经常需要我们花费大量的时间和精力去学习和理解。关于synchronized锁和ReentrantLock锁的知识点有很多,你都掌握了吗?一起来了解一下吧。对于synchronized意思相信大家都应该很清楚了,但是同时有很多小白表示对于synchronized是不是悲观锁以及它的使用场景不是很清楚,那么就一起通之前给大家介绍了synchronized和lo…

    2022年7月8日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号