block

作者: 鄙人哈哈哈哈5871 | 来源:发表于2016-07-18 21:57 被阅读47次

    一、block存储的区域

    1.stack栈  这个系统自动分配的​对栈上的block调用copy,每次会返回新复制到堆上的block的指针,同时,所有__block变量都会被复制至堆一份(多次拷贝,只会生成一份)

    2.heap堆​ 这个程序员手动分配的,需要手动Block_release(testBlockHeap);对已经位于heap上的block,再次调用copy,只会增加block的引用计数

    3.全局区 这个 copy后还是在全局区

    对全局区的block调用copy,会返回原指针,并且这期间不处理任何东西(至少目前的内部实现是这样);

    全局区 栈和堆

    二、block中引用外部变量

    1.如果需要在block中修改变量且这个变量不是静态static修饰的变量,需要__block来修饰,应为block在引用外部变量的时候会拷贝一份(static除外),在block里面变量其实是已经拷贝的一份而不是原来的

    从这个可以看出两个i的位置已经不一样了 这个可以看出,虽然i 但是block里面的i还是最开始的0


    这个有static的在block里外的地址一致


    这个在block里面修改外面的i也发生了变化


    从这里可以看出__block修饰的在block内部并没有发生copy地址一样

    三、循环引用



    从这个图里可以看出 block是这个obj的一个属性 即:

    obj -----强引用------》_block​

    而block里面有self即obj本身,所以

    _block-----强引用------》obj

    这样就造成的block和obj都不能释放,只有打破这个循环才能释放

    __weak typeof(self) weakSelf =

    self;​ 所以一般暂时用self前这样处理 在使用weakSelf

    注:1.typeof()

    请参考http://blog.csdn.net/zz_mm/article/details/46818575​

    2.

    这个是对block转换中间代码来理解block的​​http://blog.sina.com.cn/s/blog_65a8ab5d0101c709.html

    3.http://blog.devtang.com/2013/07/28/a-look-inside-blocks/​

    四、block作为属性,参数时的注意事项

    1.block作为属性

    @property(nonatomic,copy)testBlockblock;​

    这里一般使用copy,因为block不copy的话是在栈上面,如果需要在block的声明外使用block,需要将它copy到heap上面去,不然block的生命周期和stack一致

    2.block作为属性传递时候,一般需要先copy一边在传递​,他和作为属性一样,如果不copy,那block是在栈上面,而且block里面的属性如果是局部的,出来作用域就会错误,只有copy一份,这样block也会把塔索引用的变量同样的复制一份到heap上面去

    最后附上一个block的小测试

    ​http://www.cocoachina.com/bbs/read.php?tid-152222-page-1.html​

    相关文章

      网友评论

        本文标题:block

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