Block是iOS中广泛使用的匿名函数(lambada表达式),它允许你创建带有本地变量和作用域的含义块。
Block的主要特点是:
- 匿名函数。Block没有名字。
- 自动获取局部变量。Block可以自动获取定义它的作用域中的变量,即使变量生命周期已结束也可以正常使用。
- 可以作为参数传递。Block可以作为参数传递给方法、函数等。
- 简化回调函数。Block可以用于简化回调函数的定义和使用。
实现Block传值主要有几种方式: - __block修饰符。当 Block 捕获 __block 修饰的局部变量时,该变量会转变为对该块的引用,并且该变量可以在 Block 内部被直接修改。
__block int count = 0;
void (^block)() = ^{
count++;
NSLog(@"%d", count);
};
- Block作为参数传递。可以直接将 Block 作为参数传递给方法或函数。
void doSomething(void (^block)()) {
block();
}
doSomething(^{
NSLog(@"Hello");
});
- Block作为对象属性。可以将Block作为对象的属性保存和调用。
@interface Test : NSObject
@property (copy, nonatomic) void(^block)();
@end
@implementation Test
- (void)someMethod {
self.block = ^{
NSLog(@"Hello");
};
}
- (void)callBlock {
self.block();
}
@end
- Block作为delegate使用。Block可以用于实现delegate方法。
[self.button addTarget:self action:@selector(handleTap:) forControlEvents:UIControlEventTouchUpInside];
- (void)handleTap:(UIButton *)button {
button.enabled = NO;
self.tapBlock = ^{
// do something
button.enabled = YES;
};
}