protocal在三种情况中需要用到:

  • 需要声明别的类期望完成的方法时
  • 在隐藏自身类的情况下声明该类对象的接口时
  • 在某些没有继承关系的类之间获取其之间的相似性,即两个类之间没有继承关系,但是都需要实现同样的方法时,就可通过代理来实现。

protocal文件中只是定义一些方法,当你在类中实现了这个protocal时,你就需要补充这些方法,系统会自动调用这些方法

protocal中方法分为@required和@optional,其中在@required下的方法必须实现,@optional中方法是选择性实现,也可不实现。

下面以一个简单实例说明protocal的用法(OS X下)在iOS下同样使用

一、新建一个Objective-C class,命名为iOSCoder

①、在iOSCoder@end后面定义一个Protocal,命名为MyProtocalDelegate,并声明@required和@optional方法

②、在#import后声明@protocal MyProtocalDelegate

③、在interface中声明属性@property(nonatomic,assign) id<MyProtocalDelegate>   delegate;

整个.h文件如下

#import <Cocoa/Cocoa.h>@protocol MyProtocalDelegate;@interface iOSCoder : NSObject
//声明delegate属性
@property(nonatomic,assign) id<MyProtocalDelegate>   delegate;@end
//定义Protocal
@protocol MyProtocalDelegate <NSObject>
//必须实现方法
@required
-(void)StartObjectiveC;
-(void)StartPrograming;
//选择实现方法
@optional
-(void)StartJavaScript;
-(void)StartPython;@end

二、在需要用到iOSCoder类的文件中,声明并进行初始化

如果要用到iOSCoder中的delegate,则必须在.h文件中进行声明,声明格式

@interface 类名:继承类<MyProtocalDelegate>

定义iOSCoder对象

iOSCoder *ios = [[iOSCoder alloc] init];ios.delegate = self;if ([ios respondsToSelector:@selector(StartObjectiveC)]) {[self StartObjectiveC];}if ([ios respondsToSelector:@selector(StartPrograming)]) {[self StartPrograming];}

实现required方法

-(void) StartObjectiveC
{NSLog(@"@required,StartObjectiveC");
}
-(void)StartPrograming
{NSLog(@"@required,StartPrograming");}

附:在iOS ViewController中使用时

假设A要跳转到B页面时需要在B页面中实现A中的Protocal方法

.h文件

#import <UIKit/UIKit.h>
@class AViewController;
@protocol ADelegate <NSObject>- (void) AMethod@end
@interface AViewController : UIViewController
{id<ADelegate> _delegate;}
@property(nonatomic,assign)id<ADelegate> delegate;
@end

在页面跳转之前加上

if (_delegate && [_delegate respondsToSelector:@selector(AMethod)]) {[_delegate AMethod];}

在B页面中声明代理<ADelegate>,实现AMethod方法,实例化A对象,并设置代理

则在B界面会调用AMethod方法,即完成了Protocal的实现

转载于:https://my.oschina.net/joanfen/blog/140595

Objective-C学习之Protocal协议,设置代理相关推荐

  1. shell 设置代理

    文章目录 关于代理的环境变量: 示例 关于代理的环境变量: http_proxy:为http网站设置代理, 示例:192.168.1.1:8080; user:pass@192.168.1.1:808 ...

  2. 设置git协议clone代理

    0x0 最近在clone yaffs2仓库时发现clone的异常缓慢,就算开了代理也是,搜索一番发现网上大多都是将设置http.https.ssh协议的代理,对于git协定的代理讲的很少,下面分享下如 ...

  3. 重新学习的HTTP协议

    在鸡年的最后一天完成了这篇文章.表示愉悦的同时,更要祝福大家狗年大吉吧.... 下方是一根正经的分割线... 重新学习前端知识,自己整理总结了些内容...所以想分享给大家.在分享的同时,也可以自己学习 ...

  4. Mr.J-- HTTP学习笔记(六)-- 代理

    代理服务器可以是某个客户端专用的, 也可以是很多客户端共享的. 单个客户端专用的代理被称为私有代理. 众多客户端共享的代理被称为公共代理. 我的专栏:  HTTP学习笔记 私有和共享代理 • 公共代理 ...

  5. Proxifier设置代理上网详细操作

    分享知识 传递快乐 Proxifier配置上网代理 Proxifier 是一款功能非常强大的socks5客户端,可以让不支持通过代理服务器工作的网络程序能通过HTTPS或SOCKS代理或代理链.支持X ...

  6. 九、python学习之HTTP协议

    今天学习了HTTP协议,说实话,我并不想做今天的学习笔记,虽然学习的东西不多,但是对于HTTP协议要是往深层去说,所有的名词和用法都解释出来,写他个5篇都算是少的.但是,既然是学习笔记,还是本着总结今 ...

  7. 已解决urllib模块设置代理ip

    已解决urllib模块设置代理ip 文章目录 报错代码 报错翻译 报错原因 解决方法 千人全栈VIP答疑群联系博主帮忙解决报错 报错代码 最近用urllib编写了一个简单的爬虫下载网上文件的代码,刚运 ...

  8. python爬虫使用代理ip_python爬虫如何设置代理ip

    python爬虫设置代理ip的方法:首先写入获取到的ip地址到proxy:然后用百度检测ip代理是否成功,并请求网页传的参数:最后发送get请求,并获取返回页面保存到本地. [相关学习推荐:pytho ...

  9. devServer proxy跨域 设置代理 proxy

    概念 什么是同源策略 同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一 ...

最新文章

  1. android电视工程模式,智能电视如何打开ADB?进入工程模式方法
  2. android 相册 uri空,android拍照获得图片URI为空的处理方法
  3. ldd /usr/bin/mysql_mysql客户端登录时报mysql: relocation error错误
  4. Android下利用Bitmap切割图片
  5. 分离整数的各个数(信息学奥赛一本通-T1088)
  6. SET CONSTRAINTS DEFERRED | IMMEDIATE
  7. thymeleaf中的内联[ [ ] ]
  8. 计算机实验报告表九,北理大学计算机实验基础实验九实验报告表-20210617084645.pdf-原创力文档...
  9. python 通配符域名_LeetCode-python 44.通配符匹配
  10. 【TensorFlow系列】【九】利用tf.py_func自定义算子
  11. Dokcer从理论到实践----------Docker原理
  12. 前端电子时钟字体引入
  13. MAC清除Launchpad 应用程序 图标
  14. Xubuntu之lightdm开机无密码进入界面
  15. expdp/impdp 使用总结
  16. 【论文笔记】PSEUDOSEG: DESIGNING PSEUDO LABELS FOR SEMANTIC SEGMENTATION
  17. 南方科技大学2019计算机考研录取,2019浙江硕士研究生拟录取名单_南方科技大学...
  18. HttpReques
  19. 点到直线(超平面)的距离公式
  20. Ubuntu安装samb服务

热门文章

  1. Redis消息队列 | 黑马点评
  2. 【pytest】编写、共享及使用 fixture(测试夹具)
  3. 【教程】Marvell 88W8686 WiFi模块驱动程序的编写(一)
  4. 子元素自动填充父容器, 并且会自动折行- dispaly: grid
  5. 图像处理——图像的傅里叶变换
  6. 图像的傅里叶变换 java_图像傅里叶变换的步骤是什么? java
  7. SQL数据类型对照表
  8. 桥田快换产品在超声波焊接工艺的应用
  9. 数学和统计方向常用MATLAB工具箱下载地址
  10. Ubuntu 禁用向日葵的服务自启动