Block使用
1、对block的理解
> block是iOS4.0之后出现的,是仿照java中匿名函数所创造的,它是c级别的语法,效率比协议-代理高
> block的是一个匿名函数(没有名字的函数)
> 我们可以把block变量看做一个OC的变量,只是这个变量指向的是一个函数。
// 我们可以为block变量赋值, 赋值一个匿名函数。
2、对block的使用
2.1 最简单的block
//声明一个最简单的block,没有参数和返回值, ^ 是block的特殊符号
void(^)() _myFirstBlock;
//赋值 (_myFirstBlock是一个block变量, 指向后面大括号所代表的无参的匿名函数)
_myFirstBlock = ^{
NSLog(@"my first block!");
};
//调用block,相当于调用赋给block的函数
_myFirstBlock();
2.2 带参数和返回值的block
//声明一个带有两个参数的block,同时有一个返回值
NSInteger (^_mySecondBlock)(NSInteger a, NSInteger b);
//赋值
_mySecondBlock = ^(NSInteger a, NSInteger b){
NSLog(@"my second block!");
return a + b;
};
//调用
NSInteger sum = _mySecondBlock(35, 27);
NSLog(@"sum:%d",sum);
2.3 使用block实现两个页面的反向传值
案例:有两个页面, 一个是视图控制器: QFViewController, 另一个是加在其上面的视图:QFView;
说明:QFViewController 给 QFView 传值属于正向传值
QFView 给 QFViewController 传值属于反向传值
实现:从QFView到QFViewController的反向传值;
方法一:通过属性赋值block的方式
QFView.h中:
#import <UIKit/UIKit.h>
//创建一个 void(^)(NSString *returnString) 的别名 MyBlock
typedef void(^)(NSString *string) MyBlock;
@interface QFView : UIView
//定义一个MyBlock变量block(相当于:void(^ block)(NSString *string))
( 还不懂?那就理解为MyBlock是一个匿名函数类,block是它的一个对象)
@property (nonatomic, strong)MyBlock block;
@end
QFView.m中:
//按钮点击或其他事件触发,需要反向传值,则调用block
-(void)buttonClick:(UIButton *)button
{
//判断_block不为nil,则调用_block(@“”)反向传值
if (_block) {
_block(@"我把这个字符串返回");
}
}
QFViewController.m中:
//创建QFView对象
QFView *view = [[QFView alloc] initWithFrame:self.view.bounds];
//给view中的block赋值一个函数,当view中调用block()时,也就调用了下面方法;
view.block = ^(NSString *string) {
NSLog(@"收到QFView传给我的字符串:%@", string);
};
方法二:通过方法赋值block的方式
QFView.h中:
#import <UIKit/UIKit.h>
//创建一个 void(^)(NSString *returnString) 的别名 MyBlock
typedef void(^MyBlock)(NSString *string);
@interface QFView : UIView
{
MyBlock myBlock;
}
//通过方法参数传入block(如有需要还可以带其他参数)
- (void)setText:(NSString *)text MyBlock:(MyBlock)block;
@end
QFView.m中:
//通过方法传入block
-(void)setText:(NSString *)text MyBlock:(MyBlock)block
{
//将外面传入的block 赋值给本类中的成员变量myBlock(可在其他方法中使用)
myBlock = [block copy];
}
//按钮点击或其他事件触发,需要反向传值,则调用myBlock
-(void)buttonClick:(UIButton *)button
{
//判断myBlock不为nil,则调用myBlock(@“”)反向传值
if (myBlock) {
myBlock(@"我把这个字符串返回");
}
}
QFViewController.m中:
//创建QFView对象
QFView *view = [[QFView alloc] initWithFrame:self.view.bounds];
//通过view中的方法传入函数赋值给view中myBlock,当view中调用myBlock()时,也就调用了下面方法;
[view setMyBlock:^(NSString *string) {
NSLog(@"收到QFView传给我的字符串:%@", string);
}];
Block使用的更多相关文章
- Objective-C中block的底层原理
先出2个考题: 1. 上面打印的是几,captureNum2 出去作用域后是否被销毁?为什么? 同样类型的题目: 问:打印的数字为多少? 有人会回答:mutArray是captureObject方法的 ...
- iOS 键盘添加完成按钮,delegate和block回调
这个是一个比较初级一点的文章,新人可以看看.当然实现这个需求的时候自己也有一点收获,记下来吧. 前两天产品要求在工程的所有数字键盘弹出时,上面带一个小帽子,上面安装一个“完成”按钮,这个完成按钮也没有 ...
- python中IndentationError: expected an indented block错误的解决方法
IndentationError: expected an indented block 翻译为IndentationError:预期的缩进块 解决方法:有冒号的下一行要缩进,该缩进就缩进
- JDBC Tutorials: Commit or Rollback transaction in finally block
http://skeletoncoder.blogspot.com/2006/10/jdbc-tutorials-commit-or-rollback.html JDBC Tutorials: Com ...
- 嵌入式&iOS:回调函数(C)与block(OC)传 参/函数 对比
C的回调函数: callBack.h 1).声明一个doSomeThingCount函数,参数为一个(无返回值,1个int参数的)函数. void DSTCount(void(*CallBack)(i ...
- 嵌入式&iOS:回调函数(C)与block(OC)回调对比
学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...
- Block解析(iOS)
1. 操作系统中的栈和堆 我们先来看看一个由C/C++/OBJC编译的程序占用内存分布的结构: 栈区(stack):由系统自动分配,一般存放函数参数值.局部变量的值等.由编译器自动创建与释放.其操作方 ...
- CSS学习笔记——包含块 containing block
以下内容翻译自CSS 2.1官方文档.网址:https://www.w3.org/TR/CSS2/visudet.html#strut 有时,一个元素的盒子的位置和尺寸根据一个确定的矩形计算,这个确定 ...
- 用block做事件回调来简化代码,提高开发效率
我们在自定义view的时候,通常要考虑view的封装复用,所以如何把view的事件回调给Controller就是个需要好好考虑的问题, 一般来说,可选的方式主要有target-action和de ...
- 关于多个block问题
在某个添加文本的页面中,leftbarbutton是删除(直接将数组中的这个string删除),rightbarbutton是完成,分别对应两个block,完成的block是一开始写的,写到了view ...
随机推荐
- 基于Vue.js的表格分页组件
有一段时间没更新文章了,主要是因为自己一直在忙着学习新的东西而忘记分享了,实在惭愧. 这不,大半夜发文更一篇文章,分享一个自己编写的一个Vue的小组件,名叫BootPage. 不了解Vue.js的童鞋 ...
- Ioc和Ao使用扩展
一.Bean作用域 spring容器创建的时候,会将所有配置的bean对象创建出来,默认bean都是单例的.代码通过getBean()方法从容器获取指定的bean实例,容器首先会调用Bean类的无参构 ...
- JAVA中使用FTPClient实现文件上传下载实例代码
一.上传文件 原理就不介绍了,大家直接看代码吧 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ...
- struts2中值栈
值栈中的两个逻辑部分: 1.属性context,为OGNLContext类型,实际为ActionContext对象的一个引用,本质是一个Map,里面存放的各种Map,如request,session, ...
- 【6年开源路】FineUI家族今日全部更新(FineUI + FineUI3to4 + FineUI.Design + AppBox)!
刚才询问博客园团队: [6年开源路]三石今日送福利,AppBox4.0源码免费拿!FineUI家族今日全部更新(FineUI + FineUI3to4 + FineUI.Design + AppBox ...
- navicat注册码
1. navicat for mysql 9 注册码 ::: NAVL-EHNC-7N7P-W6GM 2. navicat for mysql 9.17中文版 注册码 :: NAVM-5ZC ...
- Ubuntu14.04无法在var/www内新建文档
/var/www文件夹的所有者属于www-data用户组. 要想用你自己的帐号在/var/www里面创建文件和文件夹,最好的办法是把自己的帐号纳入到www-data用户组中. 命令:sudo user ...
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
相关:http://www.cnblogs.com/wytiger/p/5996876.html 和MVC框架模式一样,Model模型处理数据代码不变在Android的App开发中,很多人经常会头疼于 ...
- 将字符串中的URL 解析,获取内容
parse_str() : parse_str("name=Bill&age=60"); echo $name."<br>";//Bill ...
- jquery中ajax用return来返回值无效
jquery中,ajax返回值,有三种写法,只有其中一种是成功的 /** * async:false,同步调用 * 返回1:2 * 失败 * 分析:ajax内部是一个或多个定义的函数,ajax中ret ...