block的使用
转载自:http://mobile.51cto.com/hot-403897.htm
一、概述
Block是C级别的语法和运行时特性。Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存、堆内存的引用,我们甚至可以将一个Block作为参数传给其他的函数或者Block。
二、热身
先看一个比较简单的Block例子:
- int multiplier = 7;
 - int (^myBlock)(int) = ^(int num) {
 - return num * multiplier;
 - };
 
在这个例子中,myBlock是一个Block变量,它接受一个int类型的参数,返回一个int类型的值。是不是很像C函数?
来,让我们typedef一下
- typedef void (^BoolBlock)(BOOL);//一个只接受一个BOOL参数,没有返回值的block
 - typedef int (^IntBlock)(void);//一个没有参数,返回int的block
 - typedef BoolBlock (^HugeBlock)(IntBlock);//看看,这个HugeBlock的参数和返回值都是block
 
三、更详细的例子
注意:上面的typedef都还有效~
主动调用一下:
- - (void)someMethod
 - {
 - BoolBlock ablock = ^(BOOL bValue) {
 - NSLog(@"Bool block!");
 - };
 - ablock();
 - }
 
作为参数返回:
- typedef void (^BoolBlock)(BOOL);
 - - (BoolBlock)foo()
 - {
 - BoolBlock ablock = ^(BOOL bValue) {
 - NSLog(@"Bool block!");
 - };
 - return [[ablock copy] autorelease];//一定要copy,将其复制到堆上,更详细的原理,将在后续章节讲解
 - }
 
类的一个成员:
- @interface OBJ1 : NSObject
 - @property (nonatomic, copy)BoolBlock block;//理由同上啊,同学们
 - @end
 - OBJ1 *obj1 = ...
 - obj1.block = ^(BOOL bValue) {
 - NSLog(@"Bool block!");
 - };
 
其他函数的参数:
- - (void)foo(BoolBlock block)
 - {
 - if (block) {
 - block();
 - }
 - }
 
甚至其他block的参数:
- BoolBlock bBlock = ^(BOOL bV){if(Bv){/*do some thing*/}};
 - HugeBlock hBlock = ^(BoolBlock bB) {bB();};
 - hBolck(bBlock);
 
啊,全局变量!:
- static int(^maxIntBlock)(int, int) = ^(int a, int b){return a>b?a:b;};
 - int main()
 - {
 - printf("%d\n", maxIntBlock(2,10));
 - return 0;
 - }
 
好了,你知道block大概能怎么用了。
四,特殊的标记,__block
如果要在block内修改block外声明的栈变量,那么一定要对该变量加__block标记:
- int main()
 - {
 - __block int i = 1024;
 - BoolBlock bBlock = ^(BOOL bV) {
 - if (bV) {
 - i++;//如果没有__block标记,是无法通过编译的。
 - }
 - };
 - }
 
好了,基础很快,更详细的内容将用来介绍深入的东西。
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 ...
 
随机推荐
- 转:Eclipse SVN插件比较 Subclipse vs Subversive
			
结论:还是用久经考验的 Subclipse http://www.wkii.org/eclipse-svn-plugins-subclipse-vs-subversive.html
 - 【QCon笔记】Native 和 Web 融合
			
#main img{width:100%;} 简介 理清 Native 和 Web 的亮点和痛点,借鉴对方亮点解决自身的痛点,并给出淘系 App 在这些方面的实践. Mobile Web 的协作能力底 ...
 - PAT 1027. 打印沙漏(20)
			
本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ***** *** * *** ***** 所谓"沙漏形状",是指每行 ...
 - delphi附带通用控件安装方法:
			
附带通用控件安装方法:----------基本安装1.对于单个控件,Componet-->install component..-->PAS或DCU文件-->install;2.对于 ...
 - 用Myisamchk让MySQL数据表更健康
			
用Myisamchk让MySQL数据表更健康 2011-03-15 09:15 水太深 ITPUB 字号:T | T 为了让MySQL数据库中的数据表“更健康”,就需要对其进行定期体检.在这里笔者推荐 ...
 - BZOJ 1096 【ZJOI2007】 仓库建设
			
Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用.突然有一天, ...
 - spring mvc4:异常处理
			
前面学习过struts2的异常处理,今天来看下spring mvc4的异常处理: 一.Servlet配置文件修改 <bean id="exceptionResolver" c ...
 - 纯手工打造漂亮的垂直时间轴,使用最简单的HTML+CSS+JQUERY完成100个版本更新记录的华丽转身!
			
前言 FineUI控件库发展至今已经有 5 个年头,目前论坛注册的QQ会员 5000 多人,捐赠用户 500 多人(捐赠用户转化率达到10%以上,在国内开源领域相信这是一个梦幻数字!也足以证明Fine ...
 - WPF路径动画(动态逆向动画)
			
WPF 中的Path.Data 不再多介绍,M开始坐标点 C弧度坐标点 L 直线坐标点 <Path x:Name="path0" Data="M 10,100 C ...
 - JAVA反射其实就是那么一回事
			
概念:什么是反射 java反射机制: JAVA反射机制是在运行状态中, 对于任意一个类,都能够知道这个类的所有属性和方法: 对于任意一个对象,都能够调用它的任意一个方法和属性: 这种动态获取的信息以及 ...