之前写过一篇关于通知的文章,可能大家觉得block部分不够清晰,本文会做详细一点的说明
老样子,先上图和文档,官方的
Block objects are a C-level syntactic and runtime feature. They are similar to standard C functions, but in addition to executable code they may also contain variable bindings to automatic (stack) or managed (heap) memory. A block can therefore maintain a set of state (data) that it can use to impact behavior when executed.
Blocks are particularly useful as a callback because the block carries both the code to be executed on callback and the data needed during that execution
block 是iOS开发中很频繁使用的一种数据类型,很类似于c语言的函数,特别是用在回调的场景中,下面就总结一些常见的声明block的方法,书写都是统一的,看上面的图就很侵袭了
作为属性的block
书写格式(一下格式都会有一个非block的作对比,最后总结)
// 对比用
@property (nonatomic, strong) NSString *name;
// void
为返回值类型,^myBlock
为block名,UIButton *buttonClicked
为参数的类型,参数数量不限,这里只写了一个,而且参数的名字也是可以省略的
@property (nonatomic, copy) void (^myBlcok)(UIButton *buttonClicked);
**使用场景**
>其实这里的使用就和delegate方法相似,只不过更简单.例如,你在一个view中点击了一个按钮,要通知控制器做出反应,你就可以在这个view中定义这样一个block,然后在控制器实现
```objc
// 以下代码只是部分代码
// 控制器中实现
[view setMyBlock:^(UIButton *buttonClicked) {
NSLog(@“view的%@按钮被点了,该干啥干啥去”, buttonClicked);
}];
// view中调用,通知
if (_myBlock) {
_myBlock(buttonClicked);
}
**上面说的都是无返回值的,有人会问那有返回值的呢?上代码**
>```objc
// view中定义了这样一个有参数的block
@property (nonatomic, copy) int (^noEasyBlock)(int, int);
// 控制器中实现
[view setNoEasyBlock:^int(int a, int b) {
return a + b;
}];
>```objc
// view中调用
if (_noEasyBlock) {
NSLog(@"%d",_noEasyBlock(3,5));
}
总结:带返回值的就是我通知你,你也得通知我,有需求时你自然会用上的,trust me!
作为参数的block
// 对比用
- (void)testButtonClicked:(UIButton *)buttonClicked;
// 类比上面的就很容易记住,都是(类型) + 名 - (void)buttonClicked:(void(^)())buttonClicked;
>总结:block作为参数时,其实使用场景和上面差不多,具体具体开发中自己可以体会,如果block使用的娴熟,delegate很少用了,毕竟要多写个协议,麻烦一些,当然delegate做通知的时候,条例,结构什么的确实清晰一些,不容易犯晕,代码的易读性也好一些.
####文章中可能会有知识点使用错误或者讲解不充分的地方,欢迎留言指正和探讨.