block小谈
来源:互联网 发布:最新小米抢购软件 编辑:程序博客网 时间:2024/06/06 00:43
Block的应用比较简单,这里只提两点:
- ARC下 有无__block qualifier(修饰)
- 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
- block小谈
- Block 的小技巧
- 四个 block 小技巧
- 小程序中的block
- Unity Application Block 小试
- Block方法与Block属性结合使用的小实现
- magento -- 前台新建block的小技巧
- block回调的一个小例子
- OC--Block 数组高级 课后小练习
- 使用 block 的小技巧和注意事项
- display:inline-block的小注意
- Block
- block
- Block
- block
- block
- block
- block
- V8 ig V3 igrimace ios7 ios8一键新机 一键抹机 清理缓存 修改串号平安易贷 uber
- 解决下载Android Build-tools 19.1.0失败
- android仿黑客帝国字符雨
- OpenGL 模型顶点法向量的计算
- Android 自定义View (一)
- block小谈
- Tomcat在命令行 配置startup.bat时出现:neither the java_home nor jre_hom
- java 多线程1
- 【NOIP】Sequence——暴力
- (NO.00001)iOS游戏SpeedBoy Lite成形记(五)
- 软件测试的完整分类
- 垂直搜索架构(爬虫部分)
- https跳转到http session丢失问题
- React ——第一个程序