block的简单实现和讲解:
2015-08-19 21:38
295 查看
1.block封装了一段代码,可以在任何时候执行。
2.block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值,它和传统的函数指针很类似,但是有区别,block是inline(内联函数)的,并且默认情况下它对局部变量是只读的
3.block很好用并且性能很高,苹果官方建议尽量多的使用block,在多线程,异步任务,集合遍历,集合排序,动画转场用的很多。
4.block: int(^sum)
(int ,int); 1。返回值类型 2。block名字
3.参数:
//定义了一block,这个block返回值是int类型,接收两个int类型的参数。
int (^sum)(int,int) = ^(int a,int b){
return a+b;
};
int demo = sum(20,49);
NSLog(@"%d",demo);
也可以用typedef将block定义为一种数据类型:这样就比较灵活了
typedefint (^Sum) (int ,int );
//此时的sum为Sum的对象。
Sum sum = ^(int a,int b){
returna+b;
};
int count = sum(2,3);
NSLog(@"%d",count);
5.注意:block可以访问外面定义的局部变量。但是不能修改
如果你想要在block修改外面定义的局部变量,那么就对变量进行声明__block (两个下划线);
__blockint num =10;
//此时的sum为Sum的对象。
Sum sum = ^(int a,int b){
returna+b;
num=11;
};
int count = sum(2,3);
NSLog(@"%d",count);
6.block作为监听器使用:(模拟按钮被点击事件);
1.定义一个button类:
2.定义一个block;
3.block的具体实现
4.调用block,
.h文件代码为:
#import<Foundation/Foundation.h>
@classButton;
//定义block;
typedefvoid(^ButtonBlock)(Button *);
@interface Button :NSObject
//为block声明setter和getter方法:
@property (nonatomic,copy)ButtonBlock
block;
-(void)onclick;
@end
block的具体实现代码:
btn.block=^(Button*btn)
{
NSLog(@"%@点击了我
",btn);
};
.m文件:
#import"Button.h"
@implementation Button
-(void)onclick{
_block(self);
}
@end
在main函数中:
Button *btn = [[[Buttonalloc]init]autorelease];
btn.block=^(Button *btn)
{
NSLog(@"%@点击了我
",btn);
};
//模拟按钮被点击了
[btnonclick];
注意:这个代码,先在main函数中实现了block的具体实现,然后再用button类中进行调用,这是属于回调机制。
2.block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值,它和传统的函数指针很类似,但是有区别,block是inline(内联函数)的,并且默认情况下它对局部变量是只读的
3.block很好用并且性能很高,苹果官方建议尽量多的使用block,在多线程,异步任务,集合遍历,集合排序,动画转场用的很多。
4.block: int(^sum)
(int ,int); 1。返回值类型 2。block名字
3.参数:
//定义了一block,这个block返回值是int类型,接收两个int类型的参数。
int (^sum)(int,int) = ^(int a,int b){
return a+b;
};
int demo = sum(20,49);
NSLog(@"%d",demo);
也可以用typedef将block定义为一种数据类型:这样就比较灵活了
typedefint (^Sum) (int ,int );
//此时的sum为Sum的对象。
Sum sum = ^(int a,int b){
returna+b;
};
int count = sum(2,3);
NSLog(@"%d",count);
5.注意:block可以访问外面定义的局部变量。但是不能修改
如果你想要在block修改外面定义的局部变量,那么就对变量进行声明__block (两个下划线);
__blockint num =10;
//此时的sum为Sum的对象。
Sum sum = ^(int a,int b){
returna+b;
num=11;
};
int count = sum(2,3);
NSLog(@"%d",count);
6.block作为监听器使用:(模拟按钮被点击事件);
1.定义一个button类:
2.定义一个block;
3.block的具体实现
4.调用block,
.h文件代码为:
#import<Foundation/Foundation.h>
@classButton;
//定义block;
typedefvoid(^ButtonBlock)(Button *);
@interface Button :NSObject
//为block声明setter和getter方法:
@property (nonatomic,copy)ButtonBlock
block;
-(void)onclick;
@end
block的具体实现代码:
btn.block=^(Button*btn)
{
NSLog(@"%@点击了我
",btn);
};
.m文件:
#import"Button.h"
@implementation Button
-(void)onclick{
_block(self);
}
@end
在main函数中:
Button *btn = [[[Buttonalloc]init]autorelease];
btn.block=^(Button *btn)
{
NSLog(@"%@点击了我
",btn);
};
//模拟按钮被点击了
[btnonclick];
注意:这个代码,先在main函数中实现了block的具体实现,然后再用button类中进行调用,这是属于回调机制。
相关文章推荐
- java HTTP请求 DefaultHttpClient is deprecated
- HDU 5389 Zero Escape
- 简易通讯录
- HDU 1874 畅通工程续 <SPFA算法>
- UVA 10820 Send a Table
- R语言常用语法总结
- HOJ1008
- 【POJ 3668】Game of Lines
- PostgreSQL Replication之第四章 设置异步复制(7)
- C#实现深复制的两种方式
- 【题解】洛谷1164小A点菜
- hdu 2066 一个人的旅行(SPFA算法)
- Java依据Url下载图片
- 用jquery实现小火箭到页面顶部的效果
- ViewState的用法
- HDU 4715 Difference Between Primes (素数表+二分)
- hdu 5319 Painter 2015 Multi-University Training Contest 3
- 无备份情况--恢复密码文件
- redirect、redirectAction等比较
- hdu 1000 A + B Problem