block

作者: hehc08 | 来源:发表于2019-01-30 13:03 被阅读0次

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

    2.静态全局变量,全局变量由于作用域的原因,于是可以直接在Block里面被改变。他们也都存储在全局区。

    静态变量传递给Block是内存地址值,所以能在Block里面直接改变值。
    总结一下在Block中改变变量值有2种方式,一是传递内存地址指针到Block中,二是改变存储区方式(__block)。

    3.对于非对象的变量来说,

    自动变量的值,被copy进了Block,不带__block的自动变量只能在里面被访问,并不能改变值。

    image

    带__block的自动变量 和 静态变量 就是直接地址访问。所以在Block里面可以直接改变变量的值。

    image

    而剩下的静态全局变量,全局变量,函数参数,也是可以在直接在Block中改变变量值的,但是他们并没有变成Block结构体__main_block_impl_0的成员变量,因为他们的作用域大,所以可以直接更改他们的值。

    值得注意的是,静态全局变量,全局变量,函数参数他们并不会被Block持有,也就是说不会增加retainCount值。

    对于对象来说,

    在MRC环境下,__block根本不会对指针所指向的对象执行copy操作,而只是把指针进行的复制。
    而在ARC环境下,对于声明为__block的外部对象,在block内部会进行retain,以至于在block环境内能安全的引用外部对象。

    相关文章

      网友评论

          本文标题:block

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