iOS DeveloperiOS 开发

block

2016-07-18  本文已影响47人  鄙人哈哈哈哈5871

一、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​

上一篇 下一篇

猜你喜欢

热点阅读