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

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

  前言

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

  本文地址:

莫然
慈溪在哪(浙江省慈溪市概况) 心情随笔

慈溪在哪(浙江省慈溪市概况)

  慈溪在哪(浙江省慈溪市概百思特网况)   慈溪(Cixi),因治南有溪,东汉董黯“母慈子孝”而得名,地处东海之滨,杭州湾南岸。东离宁波60公里,北距上海148公里,西至杭州138公里,是长江三角洲...
小池古诗意思(小池‖古诗词赏析) 心情随笔

小池古诗意思(小池‖古诗词赏析)

  小池古诗意思(小池‖古诗词赏析)   图片来源于网络   初夏时节,小满节气,一切都是那么的安详,让人在平淡的日子里感受到不可言说的美。小满是二十四节气的第八个节气,也是夏季第二个节气,它与雨水、...
关于爱国的古诗词(35首爱国诗词) 心情随笔

关于爱国的古诗词(35首爱国诗词)

  关于爱国的古诗词(35首爱国诗词)   爱国,是诗词中常见的主题。   屈原、岳飞、辛弃疾、于谦……众多爱国诗人写就许多经典的爱国诗篇。   今天,诗词君想分享35首经典的爱国诗词,让我们在诗词中...
匿名

发表评论

匿名网友 填写信息