block是什么意思(Block的类型)

莫然
莫然
莫然
36810
文章
0
评论
2021-01-1113:19:45
评论
8

  前言

  Block在iOS日常开发中极其常见,大家应该几乎都使用过,比较熟悉它的用法,而且知道Block可能引起循环引用,今天来聊聊Block,以及Block造成内存泄露的根本原因。

  Block是什么

  首先,Block和普通实例一样是是一个对象,他有自己的isa指针。

  它就是一个里面存储了指向定义代码块的函数指针和block外部上下文变量信息的结构体。通过断点我们看到block的isa指针,如下图:

  我们发现block的类型其实是不同的,这是为什么接下来我们看看Block到底有哪些类型。

  Block的类型

  我们通过实际例子看看的各种类型的block

  - (void)NSMallocBlock {

  int tempInt = 1;

  void (^block)(void) = ^ {

  NSLog(@"----------%d----------\n\n",tempInt);

  };

  block();

  [self printBlockSuperClass:block];

  }

  复制代码

  结果:NSMallocBlock -> __NSMallocBlock -> NSBlock -> NSObject

  - (void)NSStaticBlock {

  int tempInt = 1;

  __weak void (^block)(void) = ^ {

  NSLog(@"----------%d----------\n\n",tempInt);

  };

  block();

  [self printBlockSuperClass:block];

  }

  复制代码

  结果:NSStackBlock -> __NSStackBlock -> NSBlock -> NSObject

  - (void)NSGlobalBlock {

  void (^block)(int a) = ^ (int a){

  NSLog(@"----------%d----------\n\n",a);

  };

  block(1);

  [self printBlockSuperClass:block];

  }

  复制代码

  结果:NSGlobalBlock -> __NSGlobalBlock -> NSBlock -> NSObject

  我们发现:

  属性关键字和外部变量类型对Block内存的影响

  为了验证我们定义了三中关键字的block,分别有storng、weak、copy修饰:

  @property (nonatomic, strong) TestBlock strongBlock;

  @property (nonatomic, weak) TestBlock weakBlock;

  @property (nonatomic, copy) TestBlock copyBlock;

  复制代码

  验证方法如下:

  int globalInt = 1000;//全局变量

  static staticInt = 10000;//全局静态变量

  - (void)blockInMemory {

  static tempStaticInt = 100000;//局部静态变量

  int normalInt = 20000;

  _strongBlock = ^(int tempInt) {

  NSLog(@"tempInt = %d", normalInt);

  };

  _weakBlock = ^(int tempInt) {

  NSLog(@"tempInt = %d", normalInt);

  };

  _copyBlock = ^(int tempInt) {

  NSLog(@"tempInt = %d", normalInt);

  };

  NSLog(@"\nstrongBlock:%@\n_weakBlock:%@\n_copyBlock:%@",object_getClass(_strongBlock),object_getClass(_weakBlock),object_getClass(_copyBlock));

  }

  复制代码

  分别打印不同变量类型(全局变量、全局静态变量、局部静态变量、局部变量)和属性关键字下block的类型,我们可以得出如下结论:

  有普通外部变量的block是在栈区创建的,当有copy和strong修饰符修饰的时,会把block从栈移到堆区。

  ARC下使用copy和strong关键字修饰block是一样的。

  结语

  本篇为Block系列的第一篇,由此,我们了解了三种不同类型Block,接下来会以源码的方式深入了解block的底层实现,我们下篇再见。

  本文地址:

莫然
面膜可以天天用吗(面膜究竟能不能天天贴) 心情随笔

面膜可以天天用吗(面膜究竟能不能天天贴)

  面膜可以天天用吗(面膜究竟能不能天天贴)   面膜是爱美仙女们的日常必备,洗完澡后贴个面膜,第二天起来皮肤滑滑的,甚至有面膜达人几乎天天都要贴面膜,范冰冰也是个超级面膜控,一天要至少两片面膜,一年...
匿名

发表评论

匿名网友 填写信息