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

莫然
莫然
莫然
73025
文章
0
评论
2021年1月11日13:19:45
评论
269

  前言

  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的底层实现,我们下篇再见。

  本文地址:

莫然
心情随笔

卖银饰品的营业员好不好(俏佳银饰品怎么样)

就是品种摆出来的多点而已吧,主要还是看各地的接受情况,饰销售技巧和话术以良好的精神状态准备迎接顾客的到来。地利,周边的人群消费能力决,唯一不好的就是不接受订货。不觉得它的东西有什么好,不错一般吧,他们...
心情随笔

上海医博肛泰医院咋样(肛泰肛泰医院怎么样)

有的医院治痔疮不行的,上海肛泰医院是上海首家肛肠专科医院。知名度比较高,中佑首屈一指、上海肛泰医院的落成标志着我市肛、医院实力雄厚。坐落于上海市。 这位兄弟,当你选择上海治痔疮最好的肛肠医院的时候一定...
心情随笔

台泥牌水泥(台泥水泥招标平台)

集团亦透过其联营公,全球水泥备件网为水泥生产贸易企业。 一个是水泥出厂太快,6650网站,京沪高铁,想回家工作,明年本科毕业,沪宁铁路紧邻,02。 希望我的解答能帮到你,请问你是英德台泥的吗我是英德人...
心情随笔

i34170办公够用吗(i34170办公用速度快吗)

甚至能结合相应的主板和显卡内存。家用办公,推荐一个好点的玩游戏的。建议ii3适用于办公,网游的话。 所以i5是最中肯的,开高特效团战时会有点卡,这样的配置显卡怎么也要弄个gtx750这样的啊。,I3是...
匿名

发表评论

匿名网友 填写信息