近期看了几个项目中都有用到block,仔细看了看觉得block在传递参数和回调方面非常的好用。特总结写出一篇博客,有不对的地方欢迎大家指正。
1.首先在类A.h中声明一个block,因为要在外部使用,所有可以直接copy声明
@property (copy,nonatomic)void(^BlockType)(BOOL success,BOOL cancle);
alloc 一个A的对象 a,然后调用
[a setBlockType:^(BOOL success, BOOL cancle) {
if (success&&cancle) {
NSLog(@"回调block传递参数成功");
}
}];
A.m里面只要调用
BlockType(YES,YES);
你就会看到输出结果了
2.这里再写点关于block的内存管理方面的东西
block本身是像对象一样可以retain,和release。但是,block在创建的时候,它的内存是分配在栈(stack)上,而不是在堆(heap)上。他本身的作于域是属于创建时候的作用域,一旦在创建时候的作用域外面调用block将导致程序崩溃。比如下面的例子。
typedef void(^BlockCC)(void);
BlockCC _block;
- (void)viewDidLoad
{
[superviewDidLoad];
int number = 1;
_block = ^(){
NSLog(@"number %d", number);
};
}
- (IBAction)buttonDidClick:(id)sender {
_block();
}
我一点击按钮,项目就崩溃了,修改代码如下
_block = ^(){
NSLog(@"number %d", number);
};
_block = [_block copy]