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我已经有简 ...
随机推荐
- ViewBag的简单使用
一,在控制器中写好数据绑定 //通过ID查找出整列的数据 Case.Models.Case theCase = db.Case.Find(id); View ...
- spring security 1
首先我们为Spring Security专门建立一个Spring的配置文件,该文件就专门用来作为Spring Security的配置.使用Spring Security我们需要引入Spring Sec ...
- POJ 3026 Borg Maze(Prim+BFS建邻接矩阵)
( ̄▽ ̄)" #include<iostream> #include<cstdio> #include<cstring> #include<algo ...
- java中的字符编码方式
1. 问题由来 面试的时候被问到了各种编码方式的区别,结果一脸懵逼,这个地方集中学习一下. 2. 几种字符编码的方式 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符 ...
- FZU 1896 神奇的魔法数 dp
网上都说是数位dp 但是虽然在队伍里负责动态规划 但是数位dp还不会…… 百度了一下 发现和最大子序列思路差不多…… 最大子序列的dp[i][j]是表示两个序列前i项和前j项的最大子序列…… dp[i ...
- Set下面HashSet,TreeSet和LinkedHashSet的区别
Set接口Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false.Set判断两个对象相同不是使用==运算符,而是根据equals方法.也就是说,只要两个对象用eq ...
- html 图片上传预览
Html5 upload img 2012年12月27日 20:36 <!DOCTYPE HTML> <html> <head> <meta http-equ ...
- toggle的使用心得
点击同一个标签可以实现不同效果 或者几个效果 以前一般都是if 判断的 逻辑还有判断比较繁琐 看啦手册后 发现这个功能可以不用判断的自动循环点击事件 比以前的简单好用 主要用法:$("td& ...
- Android 5.0之后屏幕截图的方法
截图的几种方法 Android获取屏幕截图主要有以下三种方法 1.通过view.getDrawingCache()获取指定View的绘制缓存来实现截屏. 这种方式Android 5.0之前也可以,且不 ...
- Chapter 2 Open Book——16
By Friday I was perfectly comfortable entering my Biology class, nolonger worried that Edward would ...