美文网首页
__block关键字

__block关键字

作者: HOULI | 来源:发表于2021-08-20 14:56 被阅读0次

前提:Objective-C规定,在block中不能修改外部变量的值,若想修改则需在变量前边加__block关键字修饰
理解:

- (void)_testBlock{
   int a = 0;
  NSLog(@"block before:%p",&a);
  void (^func)(void) = ^{
      NSLog(@"block in:%p",&a);
  };
  NSLog(@"block after:%p",&a);
  func();
}

block中不能修改外部变量的值?
block中外部变量的值是被拷贝过去的,相当于值引用,并非变量原地址;
由上方代码的输出结果可见:

2021-08-20 14:05:46.036124+0800 block[37717:3248973] block before:0x7ffee33f913c
2021-08-20 14:05:46.036269+0800 block[37717:3248973] block after:0x7ffee33f913c
2021-08-20 14:06:13.870278+0800 block[37717:3248973] block in:0x600001d272f0

block before和block after的地址一致,和block内的地址不同,说明变量的地址没变,相当于值引用

加__block关键字之后,可以修改了?
前边加入__block关键字修饰之后,变量地址会被拷贝到堆区

2021-08-20 14:10:38.858026+0800 block[37764:3253396] block before:0x7ffee4427138
2021-08-20 14:10:38.858209+0800 block[37764:3253396] block after:0x6000007c2ef8
2021-08-20 14:11:05.778524+0800 block[37764:3253396] block in:0x6000007c2ef8

block in和block after的地址是一致的,说明变量的地址变化,相当于地址引用
我们可以更进一步,利用clang 生成runtime编译后的源文件,加深理解

  1. 加深理解

方式:利用clang -rewrite-objc 生成编译后的代码,用源码解读

相关文章

  • ios的block原理

    block:代码块,函数指针和指针 block:使用copy关键字 堆block:@propetry 栈block...

  • 再论block,以及weak和block关键字

    前几天去阿里面试,谈到block,我说加上__block关键字可以满足block内修改block外变量的需求,加上...

  • 关于Block

    关键字 block一般使用copy关键字进行修饰,block使用copy是从MRC遗留下来的“传统”,在MRC中,...

  • Block由浅入深(4):Block修改局部变量

    Block可以修改的变量 我们可能都知道,不使用__block关键字,我们不能在Block内修改变量的值。但是严格...

  • 第二节 block知识学习(copy,__weak,__bloc

    Dear All 这节我们来学习block知识 ,废话不说 、让我们直奔主题 __block关键字的作用 (基本数...

  • __block 关键字

    简介我们可以把Block当做Objective-C的匿名函数。Block允许开发者在两个对象之间将任意的语句当做数...

  • __block关键字

    前提:Objective-C规定,在block中不能修改外部变量的值,若想修改则需在变量前边加__block关键字...

  • __block关键字

    一.Block内部为什么不能修改auto变量 在block内部修改auto变量时,编译器会报错,Variable ...

  • __block关键字

    前提:Objective-C规定,在block中不能修改外部变量的值,若想修改则需在变量前边加__block关键字...

  • Block - __block关键字的底层实现原理

    参考文档 iOS中__block 关键字的底层实现原理 你真的理解__block修饰符的原理么? iOS Bloc...

网友评论

      本文标题:__block关键字

      本文链接:https://www.haomeiwen.com/subject/egdtiltx.html