block代码块主要用于对象之间的通信(反向传值和方法传递)。
首先,我们从内存管理方面来了解一下block
block:我们称代码块,他类似一个方法。而每一个方法都是在被调用的时候从硬盘到内存,然后去执行,执行完就消失,所以,方法的内存不需要我们管理,也就是说,方法是在内存的栈区。所以,block不像OC中的类对象(在堆区),他也是在栈区的。如果我们使用block作为一个对象的属性,我们会使用关键字copy修饰他,因为他在栈区,我们没办法控制他的消亡,当我们用copy修饰的时候,系统会把该 block的实现拷贝一份到堆区,这样我们对应的属性,就拥有的该block的所有权。就可以保证block代码块不会提前消亡。
#import "LBS_A_ViewController.h"
typedef void(^MyBlock)(void);//block写法比较特殊,一般重命名一下
@interface LBS_A_ViewController ()
@property (nonatomic,copy)MyBlock block;//定义一个MyBlock属性
@end
@implementation LBS_A_ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//实现一个block 这个block实现代码是在栈区的,也就是说,当viewDidLoad这个方法执行完之后,block就消失了。
void(^block)(void) = ^{
NSLog(@"block的简单使用");
};
//赋值给属性_block 此时就完成了copy _block指针指向堆中一块内存(存放的是block的实现代码),_block就一直拥有了代码块的使用权,直到 LBS_A_ViewCont roller对象消亡。
_block = block;
}
当然,一般我们不会这样写,block的实现都是在另一个类的对象中实现。
其次,在block的实现部分要注意一些事情
我们在实现block的时候,一般都会使用到外部(block大括号之外)变量。我们知道,局部变量(非静态)是不能在外部使用的,而block又类似是一个方法,那他为什么可以使用外部变量呢。