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​

相关文章

  • iOS开发之Block原理探究

    Block概述 Block本质 Block调用 Block分类 Block循环引用 Block原理探究 Block...

  • block的使用

    定义block 返回类型 (^block名称)(参数) = ^(){block内容}; 调用block block...

  • Block 02 - __block

    Block 02 - __block __block 的作用 __block 可以解决 Block 内部无法修改 ...

  • iOS面试之Block大全

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • iOS面试之Block模块

    Block Block内容如下: 关于Block 截获变量 __block修饰符 Block的内存管理 Block...

  • iOS Block

    Block的分类 Block有三种类型:全局Block,堆区Block,栈区Block 全局Block 当Bloc...

  • iOS block 为什么官方文档建议用 copy 修饰

    一、block 的三种类型block 三种类型:全局 block,堆 block、栈 block。全局 block...

  • iOS开发block是用copy修饰还是strong

    Block分为全局Block、堆Block和栈Block1、在定义block没有引用外部变量的时候,block为全...

  • block 初探

    全局block, 栈block, 堆block

  • Block

    一、Block本质 二、 BlocK截获变量 三、__block 修饰变量 四、Block内存管理 五、Block...

网友评论

    本文标题:block

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