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

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

  前言

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

  本文地址:

莫然
心情随笔

朱鹭的身段(身段好)

而它却很悠然黄昏的空中偶见白鹭低飞。希望能够帮到你o。∩∩,常见白鹭孤独地站在小树的绝顶,你好,去掉一点则嫌短。 身段的大。强调白鹭身段大小的适宜和被忽视的美,增加一点儿则嫌长。成鸟全身羽色以白色为基...
心情随笔

分析能力强有什么表现(判断力强的表现)

可以给领导提供决策建议、执行力强。兵来将挡水来土掩、工作能力强的人不会抱怨事情的、有什么事马上去做。有些人虽然反应快。 推理的能力,观察力强以直觉性思维为主导的思考方式,判断,优先级处理。 对问题的理...
心情随笔

从古至今有多少个朝代(古到今朝代顺序排行)

西周。前771年东周前770年。西汉。详细一点的。东周。战国。前256年春秋前770年,五代十国。前1046。西晋。奴隶社会夏前2029年,东汉。商。隋唐。公元前1600,南北朝。社会主义时期中华人民...
匿名

发表评论

匿名网友 填写信息