美文网首页iOS底层
iOS 底层学习14 -- _block的原理

iOS 底层学习14 -- _block的原理

作者: 恋空K | 来源:发表于2020-08-26 15:49 被阅读0次
    如果block访问的是一个oc类型的对象,里面会多两个成员

    新增的两个成员就是来对,对象进行内存管理操作的。






    总结:person什么时候释放,就看一点,使用强引用访问person的这个block,在什么时候释放销毁。

    默认情况下,block里面是不能去修改外面那个age的值的
    因为age的内存在main函数中,block里面的代码在另一个函数中,在另一个函数中修改age,是不可取的

    原因:首先age是在main函数这个大括号里面声明的,说明age的内存是存在于main函数的栈空间,但是block内部的代码_main_block_func_0函数里面,现在想_main_block_func_0函数里面去修改main函数里面的age,这种想在一个函数里面去改另一个函数里面的局部变量,肯定改不了的。


    static修饰的局部变量,可以修改

    如果希望block内部访问的变量能够被修改的话,第一种做法就是把局部变量变成static修饰的局部变量,或者变成全局变量,这是一种做法。






    用_block修饰age之后,生成的c文件
    _block修饰后能改变值的原理:block内部会有个指针指向一个结构体,然后通过指针找到那个结构体的内存,把结构体里面的那个int age给改掉。
    _blcok的原理


    该代码对应生成的c文件是下图

    _block不管是修饰基本数据类型还是oc对象类型,都是一样的,都会生成一个结构体,然后通过结构体间接去引用那个变量。


    这种情况不是修改array这个指针,还是使用这个指针,所以不会报错。array = nil,这种直接修改array的情况,才需要_block修饰。

    _blcok会导致block的结构变复杂,也会生成新的结构体,所以能不用_block就不用。

    相关文章

      网友评论

        本文标题:iOS 底层学习14 -- _block的原理

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