多线程:block 演练
2016-03-25 23:20
260 查看
// // ViewController.m // 04-block演练 // // Created by gzxzmac on 16/1/29. // Copyright © 2016年 gzxzmac. All rights reserved. // #import "ViewController.h" @interface ViewController () @property (nonatomic, copy) void(^myBlock)(); // 使用属性保存block @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // [self blockDemo5]; } - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self blockDemo5]; self.myBlock(); NSLog(@"%@",self.myBlock); } // 在MRC的时候,使用copy 把 block 从栈区复制到堆区 // 在ARC下,使用copy 和 strong 都可以。因为ARC使用局部变量之后,本来就是在堆区上面,只要强引用它就可以了 // block 做属性的时候,用什么来修饰? copy - (void)blockDemo5 { int i = 10; self.myBlock = ^ { NSLog(@"my block %d",i); }; } - (void)blockDemo4 { int i = 10; void (^block) () = ^ { NSLog(@"hello %d",i); }; /* -- 仅限于ARC 1. 如果没有使用外部变量,block存在全局区/静态区(不分ARC和MRC) 2. 如果使用了外部变量,block存在堆区 -- MRC 1. 如果使用了外部变量,block 存在栈区 */ // 查看block 内存地址 ,打印block 内存地址,直接 %@ NSLog(@"%@",block); } // 如何在block 里面修改变量的值 ==> 添加 __block - (void)blockDemo3 { // i 的作用范围 :布局变量,栈区 // 如果想在block 里面使用变量,要使用__block __block int i = 10; // 栈区 NSLog(@"block 之前 i ==> %p",&i); NSMutableArray *data = [NSMutableArray array]; void (^block) () = ^ { // block 把 i 的值复制过来 i = 20; // 往数组添加元素,是否需要添加__block [data addObject:@"hello"]; NSLog(@"i = %d",i); NSLog(@"block i ==> %p",&i); // NSLog(@"i = 10"); }; // i = 20; block (); NSLog(@"%@",data); NSLog(@"block 之后 i ==> %p",&i); } // 面试题: 打印多少 - (void)blockDemo2 { // i 的作用范围 :布局变量,栈区 int i = 10; // 栈区 void (^block) () = ^ { // block 把 i 的值复制过来 NSLog(@"i = %d",i); // NSLog(@"i = 10"); }; i = 20; block (); } - (void)blockDemo1 {// 1 // i 的作用范围 :布局变量,栈区 int i = 10; // 栈区 void (^block) () = ^ { // block 把 i 的值复制过来 NSLog(@"i = %d",i); }; // 如果单独定义了block 使用这种方式 [self callback:block]; // 如果没有单独定义block 就用这种方式 [self callback:^{ }]; } - (void)callback:(void(^)())block {// 2 block(); } - (void)blockDemo0 { // block 必须会手写 // 可以借助inlineBlock 来完成block 的编写,但是不要依赖 int (^blockName)(int) = ^(int index) { NSLog(@"index : %d",index); return index + 1; }; int result = blockName(10); NSLog(@"%d",result); // int a = 10; //^ () {} 如果没有参数的情况下,小括号可以省略 // 匿名函数 void (^blockDemo)() = ^ { NSLog(@"blockDemo"); }; blockDemo(); } // C语言函数 void demo (int a) { // a } @end
相关文章推荐
- Spring事务管理(详解+实例)
- 职场“潜”规则:心法和技法
- SQL语言简介
- zk-002 zookeeper的基本概念
- 多线程:UIView 动画案例
- Pycharm使用笔记
- 图片异步加载之 Android-Universal-Image-Loader
- 第七届蓝桥杯省赛8:四平方和
- 如何快速部署自己的插件到Nexus服务器(P2 Update site)?
- java io操作
- 多线程:同步与异步
- 2016第11周五
- Tomcat-Jdbc-Pool连接池参数说明
- js正则表达式用法汇总
- 基于单片机设计的俄罗斯方块----第一篇(总体规划)
- Android中listview图片错乱问题及解决方案
- 微信支付开发(5) 扫码并输入金额支付
- golang笔记——map
- OC阅读笔记二:命名规范,避免冲突
- Python 技巧(三)—— list 删除一个元素的三种做法