Block 是iOS在4.0之后新增的程式语法,一般用于回调方法,功能上和delegate类似。本文将讲解block的几种常见的使用方法,当然,block中最值得注意的还是它的内存管理,我将在《》中讲到。
环境信息:
Mac OS X 10.9.5
Xcode 5.1.1
IOS 7.1
正文:
为什么要使用block?
1. 可代替delegate完成回调,而不需要像delegate那样繁琐
2. 在某些方面,可代替selector(如NSNotificationCenter在addObserver的时候,可以使用block,而不用单独定义方法)
3. 延长对象的生命周期(block会自动持有对象,这将在《》中讲到)
4. 提高代码的复用性和可读性
block结构
block的结构和C语言的函数指针结构类似,只是将函数指针的*换成了^
block结构示意图
如何使用?
一、直接在方法中定义
1. 无返回值无参数
定义:
void (^block) (void);
赋值:
block = ^{
NSLog(@"block的内容");
};
调用:
block();
2. 有返回值有参数
定义:
int (^block)(int a);
赋值:
int (^block)(int a) = ^int(int a) {
return a > 0 ? a : -a;
};
调用:
NSLog(@"%d", block(-10));
二、将block定义为属性
定义:
@property (nonatomic, copy) int (^block)(int a);
赋值:
Class *object = [[Class alloc] init];
object.block = ^int (int a, int b) {
return a > b ? a : b;
};
调用:
调用将会在Class内部进行,所以这里使用到的self是指上面的object对象。调用之前,最好先判断对象是否给block赋值,如果block为nil,调用block会导致程序崩溃。
if (_block) {
self.block(10);
}
三、在方法中将block作为参数传入
着这种用法中,我们通常会使用typedef为block取一个别名
定义:
typedef void(^Block)(int a);
- (void)nslogParameterWithBlock:(Block)block {
if (block) {
block(10);
}
}
赋值并调用:
[object nslogParameterWithBlock:^(int a) {
NSLog(@"%d", a);
}];
总结:
block使用方便,在项目中,合适的使用block也是你的代码看起来高端大气上档次,但是block的内存管理确实是一项非常重要也非常容易出错的地方,稍不注意便会造成内存泄露,所以,在使用block的时候,也要小心。