block代码块主要用于对象之间的通信(反向传值和方法传递)。
首先,我们从内存管理方面来了解一下block
block:我们称代码块,他类似一个方法。而每一个方法都是在被调用的时候从硬盘到内存,然后去执行,执行完就消失,所以,方法的内存不需要我们管理,也就是说,方法是在内存的栈区。所以,block不像OC中的类对象(在堆区),他也是在栈区的。如果我们使用block作为一个对象的属性,我们会使用关键字copy修饰他,因为他在栈区,我们没办法控制他的消亡,当我们用copy修饰的时候,系统会把该 block的实现拷贝一份到堆区,这样我们对应的属性,就拥有的该block的所有权。就可以保证block代码块不会提前消亡。
1.Block作为对象的属性:
我们首先来定义一个类,此处简单定义一个Person类,在Person类中的.h文件中声明一个myblock属性如下:
之后再ViewController里面 创建person对象
Person *person = [[Person alloc] init];
// 1 block当做属性
person.myblock = ^(NSString *str) {
NSLog(@"这个人笑了: %@",str);
};
2.Block作为方法的参数:
方法名叫saySomething,参数名为block、类型为block的方法(block本身参数为NSString类型),声明代码如下:
// 2. Block作为方法的参数:
- (void)saySomething:(myblock)block;
person.m中实现方法
- (void)saySomething:(myblock)block{
block(@"哈哈哈哈嗝");
}
之后再ViewController里面调用
// 2.block 当做参数
[person saySomething:^(NSString *str) {
NSLog(@"说点什么吧: %@",str);
}];
3.Block作为返回值:
返回值,当我们使用带有返回值类型的方法时,当然是把定义方法的返回类型,声明为block类型,代码如下:
// 3. Block作为返回值:
- (myblock)sayhello
person.m中实现方法
- (myblock)sayhello{
return ^(NSString *str){
NSLog(@"hello nihao %@",str);
};
}
之后再ViewController里面调用
// 3 block 当做返回值
person.sayhello(@"你好");