YGben

Blocks(一)


Blocks 基本用法

时至今日,发现“总结”二字至关重要。Blocks司空见惯,意外参考到 一篇博文,决定分为 Blocks基本用法,Blocks的理解,Blocks的实现 三方面 进行总结。

1.用作局部变量

returnType (^blockName)(parameterTypes) = ^returnType(parameters) {…};

1
2
void (^changeBlock)(NSString *) = ^void(NSString *){};
或者 ^ (NSString *){}

2.用作属性

@property (nonatomic, copy, nullability) returnType (^blockName)(parameterTypes);

1
@property (nonatomic, strong) void (^changeBlock)(NSString *);

3.用作方法的参数

  • (void)someMethodThatTakesABlock:(returnType (^nullability)(parameterTypes))blockName;
1
- (void)setRedirectResponseBlock:(nullable NSURLRequest * (^)(NSURLConnection *connection, NSURLRequest *request, NSURLResponse *redirectResponse))block;

4.用作调用方法的响应

[someObject someMethodThatTakesABlock:^returnType (parameters) {…}];

1
2
3
[ShowBtnColor changeBtnColorWithBlock:^(UIColor *color) {
button.backgroundColor = color;
}];

5.用作 typedef

typedef returnType (^TypeName)(parameterTypes);
TypeName blockName = ^returnType(parameters) {…};

1
typedef NSString *(^SDWebImageCacheKeyFilterBlock)(NSURL *url);

重点来了。。。

完整的Blocks的语法是: ^ 返回值类型 参数列表 表达式

  • 返回值可以不写,因为表达式里如果没有return自然是void类型,有则当有;参数列表在无参数的情况下也可以不写。
  • 一般会采用typedef简洁Blocks,这样作为 属性 和 方法参数 不显的那样 累赘。
  • Block 类型变量可像C语言重的其它类型变量一样使用。用法一中changeBlock就是一个局部变量的Block类型。