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探究的主要内容,如果未能解决你的问题,请参考以下文章

block探究一

深入探究Block

对display主要属性的探究,以及vertical-aligin

Block的原理和使用

iOS学习之代码块(Block)

探究行内元素和块级元素