一、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三、循环引用
从这个图里可以看出 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
网友评论