Block探究
Posted discipline
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Block探究相关的知识,希望对你有一定的参考价值。
知识点:
- Block初探
- Block循环引用
- Block底层原理
- Block应用进阶
一. Block初探
Blockd的分类
1 // mian thread [block copy] 2 int a = 10; // 捕获外部变量 3 void(^block)(void) = ^{ 4 5 NSLog(@"hello block %d",a); 6 }; // 匿名函数 7 8 block(); 9 10 NSLog(@"%@",block); // 万物皆对象,block也是对象 RAC: 万物皆signal 11 12 // block 分类 13 // NSGlobalBlock : 静态区 (没有int a) 14 // NSMallocBlock : 堆Block (定义int a后) 15 // NSStackBlock : 栈Block 16 17 NSLog(@"第三种Block %@",^{ 18 NSLog(@"%d",a); 19 });
二. Block循环引用
假设A控制器跳转至TargetViewController, 如果目标控制器内有block造成循环应用, 当从TargetViewController返回时, TargetViewController不会调用析构方法(dealloc方法). 这就造成了内存泄漏. 下面列出三种方法消除循环引用.
1 #import "TargetViewController.h" 2 3 // typedef void(^LHBlock)(void); 4 typedef void(^LHBlock)(TargetViewController *); 5 6 @interface TargetViewController () 7 8 /** 说明 */ 9 @property (nonatomic, copy) LHBlock block; 10 /** 说明 */ 11 @property (nonatomic, copy) NSString *name; 12 13 @end 14 15 @implementation TargetViewController 16 17 - (void)viewDidLoad { 18 [super viewDidLoad]; 19 20 self.view.backgroundColor = [UIColor whiteColor]; 21 22 self.name = @"my name"; 23 24 // 使用__weak,就是告诉系统,这是个循环应用,所以不用调用,就会释放 25 // __weak typeof(self) weakSelf = self; 26 // self.block = ^{ 27 // NSLog(@"%@",weakSelf.name); 28 // // 延长寿命周期,strong 29 // }; 30 31 32 // 要在block里面置为nil,并且必须调用,否则不会置为nil,还是会造成循环应用 33 // __block TargetViewController *weakVC = self; 34 // self.block = ^{ 35 // NSLog(@"%@",weakVC.name); 36 // weakVC = nil; 37 // }; 38 // self.block(); 39 40 // 为什么会产生循环引用 41 // self -> block -> vc 42 // 这样不会产生循环应用,vc只是临时变量,只在作用域内有效,出来就释放了 43 self.block = ^(TargetViewController *vc) { 44 NSLog(@"%@",vc.name); 45 }; 46 // 调不调用block都会走析构方法 47 self.block(self); 48 49 } 50 51 - (void)dealloc { 52 NSLog(@"dealloc"); 53 } 54 55 @end
以上是关于Block探究的主要内容,如果未能解决你的问题,请参考以下文章