Block中可以修改全局变量,全局静态变量,局部静态变量吗?

本文探讨了Block在iOS开发中的行为,特别是对于全局变量、静态变量和自动变量的捕获和修改。Block可以捕获并改变全局变量、静态全局变量和静态变量的值,但不能直接修改自动变量的值。Block类型包括_NSConcreteStackBlock、_NSConcreteMallocBlock和_NSConcreteGlobalBlock,每种类型对应不同的内存管理和生命周期。在ARC环境下,__block关键字用于使变量在Block中可变,同时将其复制到堆上。
摘要由CSDN通过智能技术生成

原文:iOS面试题大全

  • 可以.深入研究Block捕获外部变量和__block实现原理

    • 全局变量和静态全局变量的值改变,以及它们被Block捕获进去,因为是全局的,作用域很广
    • 静态变量和自动变量,被Block从外面捕获进来,成为__main_block_impl_0这个结构体的成员变量
    • 自动变量是以值传递方式传递到Block的构造函数里面去的。Block只捕获Block中会用到的变量。由于只捕获了自动变量的值,并非内存地址,所以Block内部不能改变自动变量的值。
    • Block捕获的外部变量可以改变值的是静态变量,静态全局变量,全局变量
    • Block就分为以下3种
      • _NSConcreteStackBlock:只用到外部局部变量、成员属性变量,且没有强指针引用的block都是StackBlock。 StackBlock的生命周期由系统控制的,一旦返回之后,就被系统销毁了,是不持有对象的
        • _NSConcreteStackBlock所属的变量域一旦结束,那么该Block就会被销毁。在ARC环境下,编译器会自动的判断,把Block自动的从栈copy到堆。比如当Block作为函数返回值的时候,肯定会copy到堆上
      • _NSConcreteMallocBlock:有强指针引用或copy修饰的成员属性引用的block会被复制一份到堆中成为MallocBlock,没有强指针引用即销毁&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值