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使用的更多相关文章

  1. Objective-C中block的底层原理

    先出2个考题: 1. 上面打印的是几,captureNum2 出去作用域后是否被销毁?为什么? 同样类型的题目: 问:打印的数字为多少? 有人会回答:mutArray是captureObject方法的 ...

  2. iOS 键盘添加完成按钮,delegate和block回调

    这个是一个比较初级一点的文章,新人可以看看.当然实现这个需求的时候自己也有一点收获,记下来吧. 前两天产品要求在工程的所有数字键盘弹出时,上面带一个小帽子,上面安装一个“完成”按钮,这个完成按钮也没有 ...

  3. python中IndentationError: expected an indented block错误的解决方法

    IndentationError: expected an indented block 翻译为IndentationError:预期的缩进块 解决方法:有冒号的下一行要缩进,该缩进就缩进

  4. JDBC Tutorials: Commit or Rollback transaction in finally block

    http://skeletoncoder.blogspot.com/2006/10/jdbc-tutorials-commit-or-rollback.html JDBC Tutorials: Com ...

  5. 嵌入式&iOS:回调函数(C)与block(OC)传 参/函数 对比

    C的回调函数: callBack.h 1).声明一个doSomeThingCount函数,参数为一个(无返回值,1个int参数的)函数. void DSTCount(void(*CallBack)(i ...

  6. 嵌入式&iOS:回调函数(C)与block(OC)回调对比

    学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...

  7. Block解析(iOS)

    1. 操作系统中的栈和堆 我们先来看看一个由C/C++/OBJC编译的程序占用内存分布的结构: 栈区(stack):由系统自动分配,一般存放函数参数值.局部变量的值等.由编译器自动创建与释放.其操作方 ...

  8. CSS学习笔记——包含块 containing block

    以下内容翻译自CSS 2.1官方文档.网址:https://www.w3.org/TR/CSS2/visudet.html#strut 有时,一个元素的盒子的位置和尺寸根据一个确定的矩形计算,这个确定 ...

  9. 用block做事件回调来简化代码,提高开发效率

       我们在自定义view的时候,通常要考虑view的封装复用,所以如何把view的事件回调给Controller就是个需要好好考虑的问题, 一般来说,可选的方式主要有target-action和de ...

  10. 关于多个block问题

    在某个添加文本的页面中,leftbarbutton是删除(直接将数组中的这个string删除),rightbarbutton是完成,分别对应两个block,完成的block是一开始写的,写到了view ...

随机推荐

  1. MyBatis源码分析-MyBatis初始化流程

    MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Map使用简 ...

  2. L1-006. 连续因子

    https://www.patest.cn/contests/gplt/L1-006 题目地址 在上面 一个正整数N的因子中可能存在若干连续的数字.例如630可以分解为3*5*6*7,其中5.6.7就 ...

  3. [No00009C]Visual Studio在 解决方案资源管理器 里同步定位打开的文件

    标题的意思就是在使用VS的时候,需要我们打开编辑的文件跟解决方案的资源管理器同步显示,这样方便定位到我们在修改哪个文件. 设置如下: 工具——选项——项目和解决方案——在解决方案资源管理器中跟踪活动项 ...

  4. Python学习进程

    1周第1天 主要是变量的学习(11月8日) 1.1 python安装(win和linux下)1.2 ipython安装及使用1.3 变量的定义1.4 变量赋值1.5 运算符(赋值.算术.关系.逻辑)1 ...

  5. app开发项目简单的结构一

    一 .Network (网络) 1. 接口类(可以一个放所有接口的头文件)ApiConfig.h. (1). 可以放服务器的地址.图片服务器的地址及其它接口的地址(这样做的好处是只用导入一个头文件即可 ...

  6. PAT 1047. 编程团体赛(20)

    编程团体赛的规则为:每个参赛队由若干队员组成:所有队员独立比赛:参赛队的成绩为所有队员的成绩和:成绩最高的队获胜. 现给定所有队员的比赛成绩,请你编写程序找出冠军队. 输入格式: 输入第一行给出一个正 ...

  7. [LeetCode] Best Time to Buy and Sell Stock IV 买卖股票的最佳时间之四

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  8. 【C#】析构函数

    MSDN paper 析构函数 析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数. 析构函数往往用来做“清理善后” 的工作( ...

  9. javaWeb实现登录功能

    1.三要素 (1) 入口 就是我们所在的页面 入口到处理的数据请求会出现乱码,用request.SetCharacterEncoding("UTF-8");来解决,仅仅是用用于Po ...

  10. HTML中为何p标签内不可包含div标签?那哪些块元素里面不能放哪些块元素呢?

    先看下面的例子你就能明白两者的差别: <p>测试一下块元素与<span>内联元素</span>的差别</p> <p>测试一下<div& ...