初探block

来源:互联网 发布:yiishop2.0 源码 编辑:程序博客网 时间:2024/05/17 01:02


 近期看了几个项目中都有用到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]