IOS 中什么是 Block?如何实现 Block 传值?

Block是iOS中广泛使用的匿名函数(lambada表达式),它允许你创建带有本地变量和作用域的含义块。

Block的主要特点是:

  1. 匿名函数。Block没有名字。
  2. 自动获取局部变量。Block可以自动获取定义它的作用域中的变量,即使变量生命周期已结束也可以正常使用。
  3. 可以作为参数传递。Block可以作为参数传递给方法、函数等。
  4. 简化回调函数。Block可以用于简化回调函数的定义和使用。
    实现Block传值主要有几种方式:
  5. __block修饰符。当 Block 捕获 __block 修饰的局部变量时,该变量会转变为对该块的引用,并且该变量可以在 Block 内部被直接修改。
__block int count = 0;
void (^block)() = ^{
    count++;
    NSLog(@"%d", count);
};
  1. Block作为参数传递。可以直接将 Block 作为参数传递给方法或函数。
void doSomething(void (^block)()) {
    block();
}

doSomething(^{
    NSLog(@"Hello"); 
});
  1. Block作为对象属性。可以将Block作为对象的属性保存和调用。
@interface Test : NSObject

@property (copy, nonatomic) void(^block)();

@end

@implementation Test

- (void)someMethod {
    self.block = ^{
        NSLog(@"Hello");
    };
}

- (void)callBlock {
    self.block();
}

@end
  1. 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;
    };
}