iOS中的代理和Block
一、代理(Delegate)
1)含义
iOS中的代理,比如父母要去上班,到中午12点了,需要给宝宝喂饭吃,但是父母正在上班,这时需要有一个人来帮忙完成一些事情(需要有个保姆来帮忙给宝宝喂饭),此时,保姆就是父母的代理。在中午12点得时候,父母告诉保姆,宝宝该吃饭了,此时,作为代理的保姆,就去给宝宝喂饭。
上面的故事中,保姆就是父母的代理。
2)代理的创建
- 创建协议
@protocol DLNameDelegate <NSObject>
- 声明代理中的方法(@optional和@request)其中有可选实现和必须实现
@optional
-(void)fun:(NSString *)str;
@end
- 创建Delegate属性
@property(nonatomic,weak) id<DLNameDelegate> delegate;
3)代理的使用
在调用代理处理业务时,先判断代理类是否存在且代理类是否实现代理方法
//1.定义无参数无返回值的Block
void (^printBlock)() = ^(){
NSLog(@"no number");
};
printBlock();
可以看到 block的格式为: 返回值 (^Block名称)(参数类型) = ^(参数类型 参数名){};
block之所以很好用,是因为block可以作为参数来进行传值或其他操作。
2)声明一个block参数
@property (copy,nonatomic) void (^MyBlock)(NSString *str);
block的属性声明需要用copy,这里稍后我会进行探讨。
typedef void (^MyBlockType)(NSString*); @property (copy,nonatomic) MyBlockType myBlock2;
这是另一种声明block属性的方式,通过typedef来定义一个别名,通过别名来直接定义block属性。
3)block的使用
线程安全:在调用时需要把Block先赋值给本地变量,以防止Block突然改变。因为如果不这样的话,即便是先判断了Block属性不为空,在调用之前,一旦另一个线程把Block属性设空了,程序就会crash,
MyBlockType block = self.myBlock2;
if (block) {
block(str);
}
一般情况:
if (self.MyBlock) {
self.MyBlock(str);
}
4)示例代码:
- (IBAction)clickblockbtn:(id)sender {
// MyBlockType block = self.myBlock2;
// if (block) {
// block(self.mytf.text);
// [self dismissViewControllerAnimated:YES completion:nil];
// }
//
if (self.MyBlock) {
self.MyBlock(self.mytf.text);
} }
-(void)clickbtn{
BViewController *vc = [[BViewController alloc]init];
vc.delegate = self;
// vc.MyBlock = ^(NSString *str){
// self.mainLabel.text = str;
// };
vc.myBlock2 = ^(NSString *str){
self.mainLabel.text = str;
};
[self presentViewController:vc animated:YES completion:nil];
}
iOS中的代理和Block的更多相关文章
- Swift基础--通知,代理和block的使用抉择以及Swift中的代理
什么时候用通知,什么时候用代理,什么时候用block 通知 : 两者关系层次太深,八竿子打不着的那种最适合用通知.因为层级结构深了,用代理要一层一层往下传递,代码结构就复杂了 代理 : 父子关系,监听 ...
- 代理和block反向传值
代理传值: // SendViewController.h #import <UIKit/UIKit.h> @protocol SendInFor <NSObject> -(v ...
- 代理和 block 传值的使用
// // ZYViewController.h // BlockTest // // Created by yejiong on 14/11/2. // Copyright © 2014年 zzz. ...
- Java中jdk代理和cglib代理
代理模式 给某一个对象提供一个代理,并由代理对象控制对原对象的引用.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 在Java中代理模式从实 ...
- 使用代理和block写一个alertView
代理: MyAlertView.h: @property (nonatomic,assign)id delegate; @protocol MyAlertViewDelegate <NSObje ...
- iOS中消息传递方式
iOS中消息传递方式 在iOS中有很多种消息传递方式,这里先简单介绍一下各种消息传递方式. 1.通知:在iOS中由通知中心进行消息接收和消息广播,是一种一对多的消息传递方式. NSNotificati ...
- iOS中为什么block用copy属性
1. Block的声明和线程安全Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非ARC ...
- IOS中block和代理
从ios4开始引入block,就是代码块,结构类c语言 基本结构 返回值 (^block名称)(参数):int(^BlockName)(int):返回值为int型,参数是一个int值的叫BlockNa ...
- IOS中的Block与C++11中的lambda
ios中的block 可以说是一种函数指针,但更确切的讲,其实际上其应该算是object-c对C++11中lambda的支持或者说是一个语言上的变体,其实际内容是一样的,C++的lambda我已经有简 ...
随机推荐
- scp免密码传送文件
一.单向 ssh-keygen -t rsa 单向无密码访问远程服务器操作比较简单,比如服务器A需要无密码访问服务器B(A–>B),那么只需要在服务器A生成密钥对,将生成的公钥上传到服务器B的相 ...
- Jquery获得 selection的text 和 option值
Jquery获得 selection的text 和 option值 <select id="accountStatus" editable="false" ...
- PHP7新功能及语法变化总结
1.标量类型声明有两种模式: 强制 (默认) 和 严格模式. 现在可以使用下列类型参数(无论用强制模式还是严格模式): 字符串(string), 整数 (int), 浮点数 (float), 以及布尔 ...
- apicloud 初学
html5:在创建html时为了防止页面缩放等不兼容效果,要创建个viewport <meta name="viewport" content="maximum-s ...
- Scala Tuple类型
Tuple可以作为集合存储不同类型的数据,初始化实例如下: val tuple = (1,3,3.14,"aa") val third = tuple._3 Tuple 下标访问从 ...
- 硬盘图标修改器 V1.0 绿色版
软件名称:硬盘图标修改器 V1.0 绿色版软件语言: 简体中文授权方式: 免费软件应用平台: Win7 / Vista / Win2003 / WinXP / Win2008 软件大小: 12.3MB ...
- 菲菲更名宝贝 得意非凡版 v1.9 免费绿色版
软件名称: 菲菲更名宝贝 得意非凡版软件语言: 简体中文授权方式: 免费软件运行环境: Win8 / Win7 / Vista / WinXP软件大小: 12.5MB图片预览: 软件简介:菲菲更名宝贝 ...
- sublime 配置 python IDE
安装sublime下载地址:http://www.sublimetext.com/,请自行根据系统版本进行下载.下载好之后直接安装即可. 汉化包 汉化包下载: 汉化方法: 1.运行sublime te ...
- .net dynamic动态加属性
class Test : System.Dynamic.DynamicObject { public override bool TryGetMember(System.Dynamic.GetMemb ...
- 用shell统计访问日志里每个ip访问次数【转】
今天,要统计一个系统的每个ip访问次数,于是我找到该系统访问日志,并写脚本实现. 访问日志情况: [root@qular ~]# cd /usr/local/nginx/logs/ [root@q ...