block小谈

来源:互联网 发布:最新小米抢购软件 编辑:程序博客网 时间:2024/06/06 00:43

Block的应用比较简单,这里只提两点:

  1. ARC下 有无__block qualifier(修饰)
  2. block 反向传值

1:ARC下 有无__block qualifier(修饰)
有__block qualifier的话,会在调用block的时候取&number地址所指向的值,如果调用block的时候已经超过了number声明的scope(作用域),那么结果是undefined。

    __block int num = 10;    int(^sum)(int) = ^(int aNum){        return num + aNum;    };    num = 4;    NSLog(@"sum:%d",sum(6)); //打印结果是sum:10

没有__block qualifier的primitive c types (ps:原始C语言基本类型) 会直接在创建block的时候被capture到block里。(我的理解是:相当于根据变量类型,对应的在堆或栈中开辟一块内存,复制这个变量的值)

    int num = 10;    int(^sum)(int) = ^(int aNum){        return num + aNum;    };    num = 4;    NSLog(@"sum:%d",sum(6));//打印结果是sum:16

2:block反向传值
block反向传值的应用比较简单,可以类比 [协议-代理] 来实现。
[场景模拟:]

--1:我是老板,我想让员工把工作情况告诉我,以便公布在通告板上。--2:我是员工,老板让我干活,等我干完了就把情况汇报给他。

[代码实现:]
YuangongVC.h

#import <UIKit/UIKit.h>typedef void(^ReturnMsgBlock)(NSString *message);@interface YuangongVC : ViewController@property (nonatomic,copy) ReturnMsgBlock returnMsgBlock;@end

YuangongVC.m

利用block传值的操作代码不一定要写得viewWillDisappear里面,只要保证 YuangongVC.ReturnMsgBlock 存在即可赋值。但是要在老板那里正常显示,还需要保证老板活着。

- (void)viewDidLoad {    [super viewDidLoad];    self.view.backgroundColor = [UIColor brownColor];}
- (void)viewWillDisappear:(BOOL)animated{    [super viewWillDisappear:animated];    // 为了代码健壮性,先判断block是否存在    if (self.returnMsgBlock != nil) {        self.returnMsgBlock(@"这些是工作报告信息");    }}

LaobanVC.h

// 创建一个Label,用来充当通告板 显示信息

#import <UIKit/UIKit.h>@interface ViewController : UIViewController@property (nonatomic,strong) UILabel *showLabel;@end

LaobanVC.m

#import "YuangongVC.h"  //首先引入员工头文件- (void)viewDidLoad {    [super viewDidLoad];    self.view.backgroundColor = [UIColor brownColor];    // 搞一个push用的button    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];    btn.frame = CGRectMake(0, 0, 180, 40);    btn.center = self.view.center;    btn.backgroundColor = [UIColor darkGrayColor];    [btn setTitle:@"PUSH" forState:UIControlStateNormal];    [btn addTarget:self action:@selector(pushVC) forControlEvents:UIControlEventTouchUpInside];    [self.view addSubview:btn];    //初始化通告板     self.showLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 64, self.view.frame.size.width, 80)];    self.showLabel.backgroundColor = [UIColor lightGrayColor];    self.showLabel.textAlignment = NSTextAlignmentCenter;    self.showLabel.text = @"我是通告板";    [self.view addSubview:self.showLabel];}//push方法里面实现block- (void)pushVC{    YuangongVC *yuangongVC = [[YuangongVC alloc] init];    yuangongVC.returnMsgBlock = ^(NSString *msg) {        self.showLabel.text = msg;    };    [self.navigationController pushViewController:yuangongVC animated:YES];}

上面是最简单的实现代理反向传值。读者可以自行模拟AFNetworking等开源库封装自己的block方法,封装block方法会让代码读起来更规范。

0 0