出轨证据要怎么样才能在法律上有效_同步老公微信聊天记录会不会被发现

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

  前言

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

  • 发表于 2021-05-14 16:27
  • 阅读 ( 384 )
  • 分类:互联网

0 条评论

请先 登录 后评论
wjs5588
wjs5588

707 篇文章

你可能感兴趣的文章

相关问题