Block是IOS4以后引进的新语法,用来实现匿名函数的特性,有点类似于Java中的匿名内部类但又有一点差别。Apple官方文档对block的解释是:A block is an anonymous inline collection of code, and sometimes also called a "closure".意思就是block是一个匿名的内联代码集合,也被称为“闭包”(closure)。关于闭包可以这么理解:如果一个函数里定义了一个block,那么这个block可以访问这个函数的内部变量。blocks是对象,它封装了一段代码,这段代码可以在任何时候执行。Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。它和传统的函数指针很类似。
block的基本使用
int (^calculateBlock) (int a,int b) = ^(int x,int y){
return x + y;
};
int result = calculateBlock(1,2);
NSLog(@"Result:%d",result);
输出结果:
2012-08-10 12:39:46.064 ASIHttpRequestTest[6083:f803] Result:3
使用这种方式来定义也是一样的,等号左边的参数列表里面可以不指明参数的名称,只要指定参数类型即可:
int (^calculateBlock) (int,int) = ^(int x,int y){
return x + y;
};
等号左边定义了一个名为calculateBlock的block对象,返回值类型为int,有两个int型的参数a和b,左边是block的具体实现,这里返回两个参数的和。使用就像调用普通方法一样传入参数然后得到返回值即可。另外,在block里面只能读取外部变量,而不能对外部变量进行修改,如果要修改外部变量,需要添加__block来修饰外部变量,如下代码:
static int count = 1;
__blockint sum = 0;
int (^calculateBlock) (int,int) = ^(int x,int y){
sum = x + y;
count = 2;
return sum;
};
int result = calculateBlock(1,2);
NSLog(@"Result:%d",result);
输出结果如下:
ASIHttpRequestTest[6187:f803] Result:3,count:2
如果要在block中修改外部变量sum的值,必须用关键字__block(前面是两条下划线)来修饰,否则会报错。但是在block中可以直接修改static类型的变量。
block还可以作为函数的参数,当作为函数参数时,可以取代回调函数或者Delegate,当函数调用时触发了某个事件,则block里面的代码会执行,这样的好处是有利于整合代码和代码阅读,而不用去另外编写回调方法或实现委托方法,提高了代码的整体性和可读性,另外使用block可以直接访问函数中的局部变量也是优点之一,这样省去了在回调或委托方法中还需要另外将局部变量进行传递的麻烦,Cocoa中很多类都支持block方式的调用,以下列出了使用block的一些场景:
任务完成时回调
处理消息监听回调处理
错误回调处理
枚举回调
视图动画、变换
排序
以下是一个用block来遍历集合的例子:
//使用block来遍历集合
__block BOOL found = NO;
NSArray *array = [NSArray arrayWithObjects:@"one",@"two",@"three", nil];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if ([obj localizedCaseInsensitiveCompare:@"two"] == NSOrderedSame) {
*stop = YES;
found = YES;
NSLog(@"Enumerate is done");
}
}];
输出结果如下:
2012-08-10 13:16:26.700 ASIHttpRequestTest[6220:f803] Enumerate is done
以上就简单介绍了以下什么是block以及block的基本使用方法。
欢迎关注我的新浪微博和我交流:@唐韧_Ryan
分享到:
相关推荐
ios学习笔记中用到的美化按钮的背景图,iphone风格
ios学习笔记---simpleping 适合初学者练习使用。只是一个小的demo
是之前 IOS学习笔记上补充了一些 这边只是备份以后用到好下载 也欢迎你们来下载 学习 ^ ^
ios学习笔记 --sqllite3 创建 插入 查询 适合新手学习 加油
ios安全学习笔记, 供需要的人学习. 对iOS 感兴趣的同学可以看看
iOS学习笔记之QuartzCore框架.pdf
iOS学习笔记之QuartzCore框架.rar
iOS学习笔记,技术道路走到黑.zip
iOS学习——block深入浅出博文中的代码 博文地址:http://blog.csdn.net/u010127917/article/details/49946527
这里面讲的都是些平常见的事情,平时看看,对自己开发能力有所提高
我自学iOS开发时做的笔记,主要是OC语言的语法部分,没有包fundation框架,以我的亲身感受总结出iOS初学者容易犯的错误及疑问的地方,对本文如果意见欢迎与我交流,谢谢
UILabel类别Block扩展 包含自适应等一些用不到的小功能 建议别看 目前包含功能有: 1、block加号减号方法创建label对象 2、block加号减号方法创建自适应宽度和高度的label对象 3、block加号减号方法创建文字填充...
// [self changeNavigationState]; //改变状态栏 和 导航栏的状态 // [self changeImageScale];...// [self viewAnimation]; //View的动画 // [self imgToGrayimg]; //UIImage转为灰度图 // [self ...
懒人笔记 一个 iOS 开源笔记 App.zip,【已不再维护】超级记事本 for iOS
iOS的block是学习的难点和重点,熟练使用block可以达到代码的简单高效,特别是在网络的使用过程中。Block demo是一个简单易学的,可以便于学习原理。
iphone开发中block的详解.pages
个人整理超精密的iOS笔记.pdf