iOS __block修饰变量时的底层原理

总结:为什么Block内部不能改变自动变量(就是局部变量)的值

自动变量是以值传递方式传递到Block的构造函数里面去的。Block只捕获Block中会用到的变量。由于只捕获了自动变量的值,并没存地址,所以Block内部不能改变自动变量的值。Block捕获的外部变量可以改变值的是静态变量,静态全局变量,全局变量

拓展:

1.MRC下使用__block解决循环引用的原理

Block在捕获住__block变量之后,并不会复制到堆上,所以地址也一直都在栈上。这与ARC环境下的不一样。


图片发自简书App


2.:ARC 和 MRC 对比:

ARC环境下,一旦Block赋值就会触发copy,__block就会copy到堆上,Block也是__NSMallocBlock。ARC环境下也是存在__NSStackBlock的时候,这种情况下,__block就在栈上。

MRC环境下,只有copy,__block才会被复制到堆上,否则,__block一直都在栈上,block也只是NSStackBlock,这个时候\forwarding指针就只指向自己了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,902评论 1 32
  • block.png iOS代码块Block 概述 代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实...
    全栈农民工阅读 3,690评论 0 1
  • 简书博客已经暂停更新,想看更多技术博客请到: 掘金 :J_Knight_ 个人博客: J_Knight_ 个人公众...
    J_Knight_阅读 10,622评论 19 52
  • 今天是什么日子 起床:6:40 就寝:23:30 天气:阴天,雾霾 心情:焦虑 叫我起床的不是闹钟是梦想 今日三只...
    渐行渐知阅读 1,274评论 0 2
  • 昨天去理发,想起最近的一些问题,便去翻看手机找书,主要想在书中求得一个答案,关于正确生活和工作的的答案,读书软件从...
    天蓝的新灵阅读 3,077评论 0 0

友情链接更多精彩内容