1、对block的理解
> block是iOS4.0之后出现的,是仿照java中匿名函数所创造的,它是c级别的语法,效率比协议-代理高
> block的是一个匿名函数(没有名字的函数)
> 我们可以把block变量看做一个OC的变量,只是这个变量指向的是一个函数。
// 我们可以为block变量赋值, 赋值一个匿名函数。
2、对block的使用
2.1 最简单的block
//声明一个最简单的block,没有参数和返回值, ^ 是block的特殊符号
void(^)() _myFirstBlock;
//赋值 (_myFirstBlock是一个block变量, 指向后面大括号所代表的无参的匿名函数)
_myFirstBlock = ^{
NSLog(@"my first block!");
};
//调用block,相当于调用赋给block的函数
_myFirstBlock();
2.2 带参数和返回值的block
//声明一个带有两个参数的block,同时有一个返回值
NSInteger (^_mySecondBlock)(NSInteger a, NSInteger b);
//赋值
_mySecondBlock = ^(NSInteger a, NSInteger b){
NSLog(@"my second block!");
return a + b;
};
//调用
NSInteger sum = _mySecondBlock(35, 27);
NSLog(@"sum:%d",sum);
2.3 使用block实现两个页面的反向传值
案例:有两个页面, 一个是视图控制器: QFViewController, 另一个是加在其上面的视图:QFView;
说明:QFViewController 给 QFView 传值属于正向传值
QFView 给 QFViewController 传值属于反向传值
实现:从QFView到QFViewController的反向传值;
方法一:通过属性赋值block的方式
QFView.h中:
#import <UIKit/UIKit.h>
//创建一个 void(^)(NSString *returnString) 的别名 MyBlock
typedef void(^)(NSString *string) MyBlock;
@interface QFView : UIView
//定义一个MyBlock变量block(相当于:void(^ block)(NSString *string))
( 还不懂?那就理解为MyBlock是一个匿名函数类,block是它的一个对象)
@property (nonatomic, strong)MyBlock block;
@end
QFView.m中:
//按钮点击或其他事件触发,需要反向传值,则调用block
-(void)buttonClick:(UIButton *)button
{
//判断_block不为nil,则调用_block(@“”)反向传值
if (_block) {
_block(@"我把这个字符串返回");
}
}
QFViewController.m中:
//创建QFView对象
QFView *view = [[QFView alloc] initWithFrame:self.view.bounds];
//给view中的block赋值一个函数,当view中调用block()时,也就调用了下面方法;
view.block = ^(NSString *string) {
NSLog(@"收到QFView传给我的字符串:%@", string);
};
方法二:通过方法赋值block的方式
QFView.h中:
#import <UIKit/UIKit.h>
//创建一个 void(^)(NSString *returnString) 的别名 MyBlock
typedef void(^MyBlock)(NSString *string);
@interface QFView : UIView
{
MyBlock myBlock;
}
//通过方法参数传入block(如有需要还可以带其他参数)
- (void)setText:(NSString *)text MyBlock:(MyBlock)block;
@end
QFView.m中:
//通过方法传入block
-(void)setText:(NSString *)text MyBlock:(MyBlock)block
{
//将外面传入的block 赋值给本类中的成员变量myBlock(可在其他方法中使用)
myBlock = [block copy];
}
//按钮点击或其他事件触发,需要反向传值,则调用myBlock
-(void)buttonClick:(UIButton *)button
{
//判断myBlock不为nil,则调用myBlock(@“”)反向传值
if (myBlock) {
myBlock(@"我把这个字符串返回");
}
}
QFViewController.m中:
//创建QFView对象
QFView *view = [[QFView alloc] initWithFrame:self.view.bounds];
//通过view中的方法传入函数赋值给view中myBlock,当view中调用myBlock()时,也就调用了下面方法;
[view setMyBlock:^(NSString *string) {
NSLog(@"收到QFView传给我的字符串:%@", string);
}];